调用Express接口报ERR_HTTP_INVALID_STATUS_CODE无效状态码错误如何解决
错误原因定位
- 核心错误来自你对
res.send()方法的传参不符合Express API规范:Express的res.send()方法最多接受2个参数,第一个为响应体内容,第二个参数会被识别为HTTP响应状态码。你传入了两个独立的对象作为参数,第二个用户对象被当成了状态码传入,自然触发无效状态码的报错。 - 次要问题:你把全局错误处理中间件定义在了业务路由的前面,按照Express中间件执行顺序,错误处理中间件必须放在所有路由、其他中间件的最后面才能正常捕获异常。
解决方案
第一步:修改接口返回逻辑
你需要把两个要返回的用户对象放到一个数组/外层对象中,作为单个参数传给res.json()(返回JSON数据更推荐用这个方法替代res.send()):
// create a GET route app.get('/express_backend', (req, res) => { //Line 9 res.json([ // 用数组包裹两个对象,也可以用外层对象格式比如 {list: [对象1, 对象2]} { name: "Tester one", techs: ["React & Redux", "Express", "MySQL"], description: "Lorem ipsum doabore et", checkin: "09:00", checkout:"18:30", type:"Known" }, { name: "Tester two", techs: ["React & Redux", "Express", "MySQL"], description: "Lorem ipsum dolor sit amet, consectetet", checkin: "09:00", checkout:"18:30", type:"Blacklisted" } ]); });
第二步:调整错误处理中间件位置
把错误处理中间件移到所有路由定义的后面,修改后完整可运行代码如下:
const express = require('express'); //Line 1 const app = express(); //Line 2 const port = process.env.PORT || 5000; //Line 3 app.listen(port, () => console.log(`Listening on port ${port}`)); // 先定义所有业务路由 app.get('/express_backend', (req, res) => { //Line 9 res.json([ { name: "Tester one", techs: ["React & Redux", "Express", "MySQL"], description: "Lorem ipsum doabore et", checkin: "09:00", checkout:"18:30", type:"Known" }, { name: "Tester two", techs: ["React & Redux", "Express", "MySQL"], description: "Lorem ipsum dolor sit amet, consectetet", checkin: "09:00", checkout:"18:30", type:"Blacklisted" } ]); }); // 错误处理中间件统一放在最后 app.use((err,req,res,next)=>{ res.status(404).json({ error : { message : err.message } }); })
内容的提问来源于stack exchange,提问作者yongchang
相关产品推荐
相关产品推荐

