javascript - UnhandledPromiseRejectionWarning:错误:在将标头发送到客户端后无法设置标头
问题描述
router.get('/someendpoint/:someparam', async (request, response) =>{
try{
let theParams = request.params.someparam;
let sentItem;
if(theParams){
let lastRecord = await someModel.find().sort({_id: -1}).limit(1);
for(let i of lastRecord){
sentItem = i.itemNo;
}
}
if(theParams !== sentItem){
response.status(404).json({ErrorMessage: "Item was not issued before!"});
}
response.status(202).json({item: sentItem});
}catch(error){
response.status(400).json({ErrorMessage: error});
}
});
当我将一个参数传递给我知道数据库中不存在的“/someendpoint/:someparam”时,
我有以下代码来处理:
if(theParams !== sentItem){
response.status(404).json({ErrorMessage: "Item was not issued before!"});
}
但是,我仍然收到以下错误:
(节点:23472)UnhandledPromiseRejectionWarning:错误 [ERR_HTTP_HEADERS_SENT]:在将标头发送到客户端后无法设置标头
at ServerResponse.setHeader (_http_outgoing.js:518:11)
at ServerResponse.header
(节点:23472)UnhandledPromiseRejectionWarning:未处理的承诺拒绝。此错误源于在没有 catch 块的情况下抛出异步函数内部,或拒绝未使用 .catch() 处理的承诺。要在未处理的 Promise 拒绝时终止节点进程,请使用 CLI 标志--unhandled-rejections=strict
(请参阅https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode)。(拒绝 ID:1)(节点:23472)[DEP0018] DeprecationWarning:不推荐使用未处理的承诺拒绝。将来,未处理的 Promise 拒绝将使用非零退出代码终止 Node.js 进程。
解决方案
这应该可以解决它,因为您正在尝试向客户端发送多个响应。您需要像下面这样添加 else 语句,或者在您的客户响应后添加一个 return。
router.get('/someendpoint/:someparam', async (request, response) => {
try {
let theParams = request.params.someparam
let sentItem
if (theParams) {
let lastRecord = await someModel.find().sort({ _id: -1 }).limit(1)
for (let i of lastRecord) {
sentItem = i.itemNo
}
}
if (theParams !== sentItem) {
response.status(404).json({ ErrorMessage: 'Item was not issued before!' })
} else {
response.status(202).json({ item: sentItem })
}
} catch (error) {
response.status(400).json({ ErrorMessage: error })
}
})
或者保持原样,只需添加如下所示的返回
response.status(404).json({ ErrorMessage: 'Item was not issued before!' })
return
推荐阅读
- python - 如何与前一组(月)的同一行执行自连接以在 Pyspark 中引入其他列
- javascript - 直接使用变量名与 getElementById 引用元素
- python - 有人知道如何为 anaconda/spyder 安装 gtk3 吗?在窗户上
- next.js - VIDEOJS:错误:(代码:4 MEDIA_ERR_SRC_NOT_SUPPORTED)与 Azure 媒体服务
- flutter - 如何在 Flutter 中使用 CustomPainter 绘制动画帧?
- javascript - firestore valueChanges() 不会立即更新用户数据
- dask - 从 Minio 读取 Dask 引发了将二进制字符串 JSON 读取/转换为 utf8 的问题
- xquery - 换行在 XQuery 的行尾留下额外的空间
- vue.js - 如何在 vue.config.js 中使用 ES6?
- javascript - 生成新颜色而不刷新页面