发送PUT请求出错,DELETE、PUT及单产品GET接口无法正常工作的问题求助
发送PUT请求出错,DELETE、PUT及单产品GET接口无法正常工作的问题求助
我帮你排查了代码里的几个关键问题,这些应该就是导致你PUT、DELETE和单产品GET接口失效,并且返回HTML错误页面的原因:
1. 路由路径缺少开头的斜杠
你的PUT路由定义少了最关键的开头斜杠:
router.route("product/:id").put(updateProduct)
Express里的路由路径如果不以/开头,会被当作相对路径,这会导致你在Postman请求/product/:id时,根本匹配不到这个路由。服务器找不到对应的接口,就会返回默认的404 HTML错误页面。
修复方法:给路径加上开头的斜杠,和其他路由保持一致:
router.route("/product/:id").put(updateProduct)
2. getProduct和deleteProduct控制器函数缺少请求响应对象参数
你这两个控制器的写法和其他正常工作的(比如createProduct、getAllProducts)不一样,没有接收req和res参数:
比如getProduct函数里直接用了res,但这个参数根本没传入,运行时会抛出ReferenceError: res is not defined的错误,服务器内部出错后就会返回HTML错误页面。deleteProduct虽然没直接用res,但也没法给客户端返回正确的状态码和提示信息。
修复后的getProduct:
exports.getProduct = async(req, res)=>{ const product = await Product.findById(req.params.id); if(!product){ // 资源不存在应该用404状态码,不是500(500是服务器内部错误) return res.status(404).json({success:false,message:"Product not found"}) } res.status(200).json({success:true, product}) }
修复后的deleteProduct:
exports.deleteProduct = async(req, res)=>{ const product = await Product.findByIdAndDelete(req.params.id); if(!product){ return res.status(404).json({success:false,message:"Product not found"}) } res.status(200).json({success:true, message:"Product deleted successfully"}) }
3. 简化路由定义,保持代码一致性
现在你的DELETE和单产品GET路由用了额外的异步回调包裹控制器,其实可以直接用router.route链式调用,和PUT路由合并,代码更整洁:
// 把这几个路由合并成一个链式调用 router.route("/product/:id") .get(getProduct) .put(updateProduct) .delete(deleteProduct);
这样就不需要单独写router.delete和router.get的回调了,直接复用修复后的控制器函数即可。
按照上面的步骤修改后,你的这几个接口应该就能正常工作,不会再返回HTML页面了。
备注:内容来源于stack exchange,提问作者Vaishali
相关产品推荐
相关产品推荐

