node.js - 返回错误的节点 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 文件,希望它会有所帮助。
任何帮助表示赞赏。在此先感谢您的帮助。
解决方案
您似乎不了解 express 的工作原理。所以你应该做的第一件事就是去阅读文档。
这是productRoute
App.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
推荐阅读
- java - cmd中的scipt在java文件中创建包目录
- python - 具有共享输出的python多处理
- javascript - 从 json 数据创建表
- javascript - 如何将 onClick 事件设置为延迟加载的图形或图像元素
- arrays - Excel VBA 比较部分行并删除重复项
- python-3.x - 如何在 Pycharm 中设置 shell 提示符
- python - 将循环添加/附加到另一个循环的末尾
- javascript - Vue.js 中有没有办法在使用 v-for 时生成分隔符(类似于`Array.join()` FreeMarker 的`<#sep>`)
- r - 即使设置为另一个值,主题中设置的图例位置也保存为“正确”
- ios - 在回调中以编程方式推送视图,SwiftUI