(Nodejs + Restify) 发送后无法设置 headers - 承诺拒绝警告
(Nodejs + Restify) Can't set headers after they are sent - promise rejection warning
UnhandledPromiseRejectionWarning:未处理的承诺拒绝(拒绝 ID:1):错误:发送后无法设置 headers。
当我连续点击 API 或在请求完成之前再次点击 API 时会发生此错误。
参考了很多解决方案都无法得到合适的answer.pls,帮我解决一下。
exports.getRecords = function(req, res) {
db.task(t => {
return t.batch([
t.any(selectQuery),
t.any(recordCountQuery)
]);
})
.then(data => {
//create a formatted object based on the two queries with recordCount
var output = {};
output.meta = data[1][0];
let petData = data[0];
/*
* Checks If the pet details available and then processing the pets Data
* To get the existing image URL.
*/
if (!util.isNullOrUndefined(petData)) {
//Iterating over the Array of pets and process each pets with promises()
Promise.all(petData.map(pet => {
//Processing each pet
return processUtil.getvalidData(pet)
.then(pet => pet);
}))
.then(results => {
//After processing all the pets send the output
output.data = results;
res.json(output);
})
};
})
.catch(function(err) {
if (util.isError(err)) {
res.error('NotFoundError', err);
} // return 404
else {
res.error('InternalServerError', err);
}; //else 500
});
};
这是两个响应的控制台日志
单次点击的响应日志
"15" "TRACE" "services-data" "lynd-PC" "sr" "4596ec40" "" "GET" "/data/2" "request received"
"16" "TRACE" "services-data" "lynd-PC" "" "4596ec40" "" "GET" "/data/2" ""
"17" "TRACE" "services-data" "lynd-PC" "" "4596ec40" "" "GET" "/data/2" ""
"18" "TRACE" "services-data" "lynd-PC" "ss" "4596ec40" "200" "GET" "/data/2" "response sent"
在请求完成之前我们两次点击 API 时的响应日志。
"15" "TRACE" "services-data" "lynd-PC" "sr" "1a85afb7" "" "GET" "/data/2" "request received"
"15" "TRACE" "services-data" "lynd-PC" "" "1a85afb7" "" "GET" "/data/2" ""
"16" "TRACE" "services-data" "lynd-PC" "" "1a85afb7" "" "GET" "/data/2" ""
"17" "TRACE" "services-data" "lynd-PC" "ss" "1a85afb7" "500" "GET" "/data/2" "response sent"
"18" "TRACE" "services-data" "lynd-PC" "" "1a85afb7" "" "GET" "/data/2" ""
(node:3860) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 2): Error: Can't set headers after they are sent.
首先,您的代码中 Promise.all()
没有拒绝处理程序。您可以通过更改以下内容将其链接到父承诺链(它确实有一个拒绝处理程序):
Promise.all(petData.map(pet => {
对此:
return Promise.all(petData.map(pet => {
因此,这将解决一次未处理拒绝的机会。或者,您可以将自己的拒绝句柄添加到 Promise.all()
承诺中,如果您更愿意为其设置单独的拒绝处理程序。
您似乎还有多个代码路径不会发送任何响应。如果这种情况:
if (!util.isNullOrUndefined(petData)) {
不满足(意味着它不进入 if
块),那么您的代码将不会发送任何响应,这通常是编码错误,因为每个请求都需要发送一个响应。
UnhandledPromiseRejectionWarning:未处理的承诺拒绝(拒绝 ID:1):错误:发送后无法设置 headers。 当我连续点击 API 或在请求完成之前再次点击 API 时会发生此错误。 参考了很多解决方案都无法得到合适的answer.pls,帮我解决一下。
exports.getRecords = function(req, res) {
db.task(t => {
return t.batch([
t.any(selectQuery),
t.any(recordCountQuery)
]);
})
.then(data => {
//create a formatted object based on the two queries with recordCount
var output = {};
output.meta = data[1][0];
let petData = data[0];
/*
* Checks If the pet details available and then processing the pets Data
* To get the existing image URL.
*/
if (!util.isNullOrUndefined(petData)) {
//Iterating over the Array of pets and process each pets with promises()
Promise.all(petData.map(pet => {
//Processing each pet
return processUtil.getvalidData(pet)
.then(pet => pet);
}))
.then(results => {
//After processing all the pets send the output
output.data = results;
res.json(output);
})
};
})
.catch(function(err) {
if (util.isError(err)) {
res.error('NotFoundError', err);
} // return 404
else {
res.error('InternalServerError', err);
}; //else 500
});
};
这是两个响应的控制台日志
单次点击的响应日志
"15" "TRACE" "services-data" "lynd-PC" "sr" "4596ec40" "" "GET" "/data/2" "request received"
"16" "TRACE" "services-data" "lynd-PC" "" "4596ec40" "" "GET" "/data/2" ""
"17" "TRACE" "services-data" "lynd-PC" "" "4596ec40" "" "GET" "/data/2" ""
"18" "TRACE" "services-data" "lynd-PC" "ss" "4596ec40" "200" "GET" "/data/2" "response sent"
在请求完成之前我们两次点击 API 时的响应日志。
"15" "TRACE" "services-data" "lynd-PC" "sr" "1a85afb7" "" "GET" "/data/2" "request received"
"15" "TRACE" "services-data" "lynd-PC" "" "1a85afb7" "" "GET" "/data/2" ""
"16" "TRACE" "services-data" "lynd-PC" "" "1a85afb7" "" "GET" "/data/2" ""
"17" "TRACE" "services-data" "lynd-PC" "ss" "1a85afb7" "500" "GET" "/data/2" "response sent"
"18" "TRACE" "services-data" "lynd-PC" "" "1a85afb7" "" "GET" "/data/2" ""
(node:3860) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 2): Error: Can't set headers after they are sent.
首先,您的代码中 Promise.all()
没有拒绝处理程序。您可以通过更改以下内容将其链接到父承诺链(它确实有一个拒绝处理程序):
Promise.all(petData.map(pet => {
对此:
return Promise.all(petData.map(pet => {
因此,这将解决一次未处理拒绝的机会。或者,您可以将自己的拒绝句柄添加到 Promise.all()
承诺中,如果您更愿意为其设置单独的拒绝处理程序。
您似乎还有多个代码路径不会发送任何响应。如果这种情况:
if (!util.isNullOrUndefined(petData)) {
不满足(意味着它不进入 if
块),那么您的代码将不会发送任何响应,这通常是编码错误,因为每个请求都需要发送一个响应。