You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

发送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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 15:53:06