javascript - 未处理的承诺拒绝和 ERR_HTTP_HEADERS_SENT
问题描述
我正在尝试使用 node express 和 mysql 创建一个 rest api 服务器,请求的结构是这样的:
这是路线
router.get('/api/courseDetails/:id', async (req, res) => {
try {
let levels = await db.levelsByCourseId(req.params.id)
res.sendStatus(200).json(levels)
} catch (e) {
console.log(e)
res.sendStatus(500)
}
})
这是查询:
requests.levelsByCourseId = (id) => {
let query = "select * from levels where parent_course_id="+id+" and visibility>0"
return new Promise((resolve, reject) => {
pool.query(query,(err, results) => {
if (err) {
return reject(err)
}
return resolve(results)
})
})
}
我也将此结构用于其他没有错误的请求,但这给了我这个错误:
Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
at ServerResponse.setHeader (_http_outgoing.js:485:11)
at ServerResponse.header (C:\Users\giuse\VScodeProjects\noderest-tutorial-server\node_modules\express\lib\response.js:771:10)
at ServerResponse.json (C:\Users\giuse\VScodeProjects\noderest-tutorial-server\node_modules\express\lib\response.js:264:10)
at C:\Users\giuse\VScodeProjects\noderest-tutorial-server\server\routes\index.js:47:29
at processTicksAndRejections (internal/process/task_queues.js:93:5) {
code: 'ERR_HTTP_HEADERS_SENT'
}
(node:15588) UnhandledPromiseRejectionWarning: Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
at ServerResponse.setHeader (_http_outgoing.js:485:11)
at ServerResponse.header (C:\Users\giuse\VScodeProjects\noderest-tutorial-server\node_modules\express\lib\response.js:771:10)
at ServerResponse.contentType (C:\Users\giuse\VScodeProjects\noderest-tutorial-server\node_modules\express\lib\response.js:599:15)
at ServerResponse.sendStatus (C:\Users\giuse\VScodeProjects\noderest-tutorial-server\node_modules\express\lib\response.js:357:8)
at C:\Users\giuse\VScodeProjects\noderest-tutorial-server\server\routes\index.js:50:13
at processTicksAndRejections (internal/process/task_queues.js:93:5)
(node:15588) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:15588) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
任何人都可以帮助我吗?谢谢你
编辑:在客户端我有一个承诺而不是一些数据(它在承诺内)
Promise {<pending>}
__proto__: Promise
[[PromiseState]]: "fulfilled"
[[PromiseResult]]: "OK"
和 axios 代码:
static async getCourseDetails(id) {
try {
const data = await axios.get(basepath + '/api/courseDetails/' + id)
return data.data
} catch (error) {
throw error;
}
}
解决方案
在将结果发送给客户端之前,您使用了错误的方法来设置状态。它应该是这样的:
res.status(200).json(levels)
打电话给setStatus
你res.status(200).send('OK')
,然后你打电话json
也设置状态 200 并将结果作为 JSON 发送。
推荐阅读
- android - 如何获取数组中索引的颜色值?
- html - 页脚没有像应有的那样停靠到底部
- bash - Bash For 循环中的奇怪行为
- python - 如何使用 python 标准库在 html 页面中嵌入干净的脚本
- flutter - 带有 ListView 的 Flutter Stepper 未呈现
- python - 工作的网络爬虫,突然不再工作了
- geocoding - 反向地理定位。加载 api/geocode 我得到 SyntaxError: Unexpected token ':'。解析错误
- python - 二维码在 tkinter GUI python 中显示
- jquery - 先成功后如何运行另一个AJAX
- kubernetes - Kubernetes 如何进行部署以更新映像自动 CI/CD