【发布时间】:2021-03-21 09:40:50
【问题描述】:
我创建了一个基本的 Nodejs CRUD 和身份验证 API。
在使用 Postman 测试新订单的基本创建操作时,它返回状态码 404,响应正文为“无法发布”。
错误:
<html lang="en">
<head>
<meta charset="utf-8">
<title>Error</title>
</head>
<body>
<pre>Cannot POST /order/addorder</pre>
</body>
</html>
API 逻辑似乎对我和路由器都是正确的。
module.exports.add_order = auth, async (req, res) => {
try {
const { productName, quantity } = req.body;
if (!productName || !quantity)
return res.status(400).json({ msg: "Not all fields have been entered" });
const existingorder = await Order.findOne({ productName });
if (existingorder)
return res.status(400).json({ msg: "A product with this name already exists" });
const newOrder = await new Order({
productName,
quantity,
userId: auth.user,
timestamp
});
const savedOrder = await newOrder.save();
res.json(savedOrder);
} catch (err) {
res.status(500).json({ error: err.message });
}
}
auth 函数是一个验证 JWT 的中间件函数。
路由器:
orderrouter.get('/readorder', ordercontroller.read_order);
orderrouter.post('/addorder', ordercontroller.add_order);
orderrouter.put('/updateorder', ordercontroller.update_order);
orderrouter.delete('/deleteorder', ordercontroller.delete_order);
module.exports = orderrouter;
【问题讨论】:
-
您的代码当前所做的是:
module.exports.add_order = auth;,然后它创建了一个未使用的async函数。将其设为数组:module.exports.add_order = [auth, async (req, res) => {}];。另外,以防万一,由于您没有显示这部分,您是否正确声明app.use('/order', orderrouter);? -
是的,我已经在
server.js主文件中声明了app.use('/order', orderrouter);函数。数组方法奏效了。但我不明白它是如何工作的。 -
当你声明一个路由时,你是在传递它的中间件。有时,您只有 1 个中间件(您自己的功能);
app.post('/foo', () => {}),有时您想通过将多个参数作为单独的参数传递来链接它们:app.post('/foo', auth, () => {})。但是为了方便,Express 还允许你传递一个数组,而不是不同的参数。对于像您这样的用例:app.post('/foo", [auth, () => {}]) -
知道了。谢谢。 :)
标签: javascript node.js express jwt postman