首页 > 解决方案 > 返回错误的节点 js REST API 显示“无法发布 /api/v1/product”

问题描述

我正在尝试使用node js为rest API创建一个发布方法,但它说不能在邮递员中发布/API/v1/product,但是在控制台中,没有错误,谁能帮助我?

这是我的代码:

我的 App.js 文件:

const express = require("express");
const app = express();
const mongoose = require("mongoose");
const morgan = require("morgan");
const bodyParser = require("body-parser");
const path = require("path");
const cors = require("cors");
const os = require("os");
const fs = require('fs');
const networkInterfaces = os.networkInterfaces();
const ip = networkInterfaces.en0[1].address;

require("dotenv/config");

//import routes
const productRoute = require("./routes/product");
const cartRoute = require("./routes/cart");
const orderRoute = require("./routes/order");
const favoriteRoute = require("./routes/favorite");
const authRoute = require("./routes/auth");
const notification = require("./middlewares/pushNotification");
const console = require("console");

const dbURI = process.env.DB_CONNECTION;
mongoose.connect(
  dbURI,
  {
    useNewUrlParser: true,
    useUnifiedTopology: true,
    useFindAndModify: false,
    useCreateIndex: true,
  },
  () => {
    app.listen(process.env.PORT, ip);
    let dirPath = path.join(
      __dirname,
      "public/api/static/images/productPictures"
    );
    let dirPathUser = path.join(
      __dirname,
      "public/api/static/images/userprofile"
    );
    createDir(dirPath);
    createDir(dirPathUser);
    console.log("Connected to DB");
  }
);

function createDir(dirPath) {
  if (!fs.existsSync(dirPath)) {
    fs.mkdirSync(dirPath, { recursive: true }, (err) => {
      if (err) {
        console.error("createDir Error:", err);
      } else {
        console.log("Directory is made!");
      }
    });
  }
}

app.use(morgan("dev"));
app.use("/public", express.static(path.join(__dirname, "public")));
app.use(cors());
app.use(express.json());
app.use(bodyParser.json({ limit: "10mb" }));
app.use(bodyParser.urlencoded({ extended: false, limit: "10mb" }));

app.get("/expo", (req, res) => {
  const id = req.query.userid;
  const token = req.query.token;
  console.log(id, token);
  res.writeHead(301, {
    Location: `exp://${ip}:3000/--/ResetPw?userid=${id}&token=${token}`,
  });
  res.end();
});
app.use(`/api/${process.env.VERSION}/product`, productRoute);
app.use(`/api/${process.env.VERSION}/cart`, cartRoute);
app.use(`/api/${process.env.VERSION}/order`, orderRoute);
app.use(`/api/${process.env.VERSION}/favoritelist`, favoriteRoute);
app.use(`/api/${process.env.VERSION}/user`, authRoute);
app.use(`/api/notification`, notification);

const port = process.env.PORT || '3000';
const address = process.env.ADDRESS || '127.0.0.1';
app.listen(port,address, () => console.log('Server running on http:// ' + address + ':' + port +'/'));

我的 Controller.product.js 文件:

const Product = require("../models/product");

const product_get = (req, res) => {
  let page = parseInt(req.query.page) || 0; //for next page pass 1 here
  let limit = parseInt(req.query.limit) || 0;
  Product.find()
    .sort({ update_at: -1 })
    .skip(page * limit) //Notice here
    .limit(limit)
    // eslint-disable-next-line consistent-return
    .exec((err, data) => {
      if (err) {
        return res.status(400).send({
          status: "ERR_SERVER",
          message: err.message,
          content: null,
        });
      }
      Product.countDocuments().exec((count_error, count) => {
        if (err) {
          return res.json(count_error);
        }
        return res.json({
          total: count,
          page: page,
          pageSize: data.length,
          content: data,
        });
      });
    });
};

const product_post = (req, res) => {
  const host = process.env.HOST_NAME;
  const filename = req.body.filename.replace(/ +/g, "");
  if (!req.body || !req.file) {
    return res.status(200).send({
      status: "ERR_REQUEST",
      message: "Please check your request!",
      content: null,
    });
  }

  const imageUrl =
    host + "/public/api/static/images/productPictures/" + filename + ".jpg";
  const resizeUrl =
    host +
    "/public/api/static/images/productPictures/" +
    "256x144-" +
    filename +
    ".jpg";

  const product = new Product({
    filename: req.body.filename,
    price: req.body.price,
    color: req.body.color,
    origin: req.body.origin,
    standard: req.body.standard,
    description: req.body.description,
    url: imageUrl,
    thumb: resizeUrl,
    type: req.body.type,
  });
  return product
    .save()
    .then((data) => {
      return res.status(200).send({
        status: "OK",
        message: "Added Product Successfully",
        content: data,
      });
    })
    .catch((err) => {
      return res.status(400).send({
        status: "ERR_SERVER",
        message: err.message,
        content: null,
      });
    });
};

// eslint-disable-next-line consistent-return
const product_update = async (req, res) => {
  const id = req.params.id;
  const host = process.env.HOST_NAME;
  let filename = "";
  let imageUrl = "";
  let resizeUrl = "";
  if (!req.params.id || !req.body) {
    return res.status(200).send({
      status: "ERR_REQUEST",
      message: "Please check your ID request",
      content: null,
    });
  }
  if (req.file) {
    filename = await req.body.filename.replace(/ +/g, "");
    imageUrl =
      host + "/public/api/static/images/productPictures/" + filename + ".jpg";
    resizeUrl =
      host +
      "/public/api/static/images/productPictures/" +
      "256x144-" +
      filename +
      ".jpg";
  }

  const product = req.file
    ? {
        filename: req.body.filename,
        price: req.body.price,
        color: req.body.color,
        origin: req.body.origin,
        standard: req.body.standard,
        description: req.body.description,
        url: imageUrl,
        thumb: resizeUrl,
        type: req.body.type,
      }
    : req.body;
  console.log(product);
  Product.findByIdAndUpdate(id, product)
    .then((data) => {
      return res.status(200).send({
        status: "OK",
        message: "Updated Product Successfully",
        content: data,
      });
    })
    .catch((err) => {
      return res.status(400).send({
        status: "ERR_SERVER",
        message: err.message,
        content: null,
      });
    });
};

const product_delete = (req, res) => {
  const id = req.params.id;
  Product.findByIdAndDelete(id)
    .then((data) => {
      return res.status(200).send({
        status: "OK",
        message: "Deleted Product Successfully",
        content: data,
      });
    })
    .catch((err) => {
      return res.status(400).send({
        status: "ERR_SERVER",
        message: err.message,
        content: null,
      });
    });
};

module.exports = {
  product_get,
  product_post,
  product_update,
  product_delete,
};

产品.js:

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

const productSchema = new Schema(
  {
    filename: {
      type: String,
      required: true,
      unique: true,
    },
    price: {
      type: String,
      required: true,
    },
    color: {
      type: String,
      required: true,
    },
    origin: {
      type: String,
      required: true,
    },
    standard: {
      type: String,
    },
    description: {
      type: String,
      required: true,
    },
    url: {
      type: String,
      default: '',
    },
    thumb: {
      type: String,
      default: '',
    },
    type: {
      type: String,
      required: true,
    },
  },
  { timestamps: true }
);
const Product = mongoose.model('product', productSchema);

module.exports = Product;

我还添加了 product.js 文件,希望它会有所帮助。

任何帮助表示赞赏。在此先感谢您的帮助。

标签: node.jsmongodbexpresspostman

解决方案


您似乎不了解 express 的工作原理。所以你应该做的第一件事就是去阅读文档

这是productRouteApp.js 中的变量(您从控制器导出的对象):

const productRoute = require("./routes/product");
/*{
  product_get,
  product_post,
  product_update,
  product_delete,
}*/

现在,如果您阅读文档,您应该知道app.use需要字符串路径和函数或函数数组

app.use('/path', <Function or Array of Functions>);

所以这显然是错误的

app.use(`/api/${process.env.VERSION}/product`, productRoute);

因为productRoute是一个Object

您只需要这样做。

app.get(`/api/${process.env.VERSION}/product`, productRoute.product_get);
app.post(`/api/${process.env.VERSION}/product`, productRoute.product_post);
app.patch(`/api/${process.env.VERSION}/product`, productRoute.product_update);
app.delete(`/api/${process.env.VERSION}/product`, productRoute.product_delete);

另一种方法是使用路由器https://expressjs.com/en/api.html#router


推荐阅读