[英]NodeJS Unhandled rejection error: Can't set headers after they are sent
我最近參與了一個nodejs項目,當我嘗試在我的數據庫訪問和我的路由之間使用promises時遇到錯誤在http:// localhost:8080 /上請求響應時發送它們后無法設置標題 api /用戶 。 雖然我知道堆棧上的許多解決方案都沒有為我解決,所以這是我在router.js的路由代碼
server.get('/api/user/', function (req, res) {
database.getUser()
.then(function(data){
res.send(data);
}, function(err){
res.send(500,{error: err});
});
});
而database.js的第一部分包括函數getUser
(function() {
'use strict';
var Promise = require('bluebird'),
mysql = require("mysql"),
bcrypt = require('bcryptjs'),
client;
exports.connect = function(){
return new Promise(function(resolve, reject) {
client = mysql.createPool({
connectionLimit : 100,
waitForConnection: true,
host : 'localhost',
user : 'root',
password : 'root',
database : 'public',
debug : false
});
if(!client){
reject('Deu merda');
}
else{
resolve();
}
});
}
exports.getUser = function(){
return new Promise(function (resolve, reject) {
var query = "SELECT name FROM public.users";
query = mysql.format(query);
client.query(query,function (err, result) {
if (err) {
reject(err);
} else {
resolve(result);
}
});
});
}
任何幫助都會很棒,謝謝你提前!
編輯:我再次檢查我的代碼,我有一個中間件來檢查用戶是否有權訪問某個頁面,因為它是剩下的最后一個選項之一,我可以在這里更改它:
(function() {
'use strict';
var routes = require("./routes"),
cookie = require("./utils");
module.exports = function(req, res, next) {
var i;
if (req.url.split('/')[1] == 'api') {
// START REGION: API permissions (all)
for (i = 0; i < routes.api.all.length; i++) {
if (routes.api.all[i].indexOf(req.url) > -1) {
break;
}
}
if (i != routes.api.all.length) {
next();
} else {
// END REGION: API permissions (all)
// START REGION: API permissions (logged)
cookie.verifySession(req.cookies.session)
.then(function (userId) {
for (i = 0; i < routes.api.logged.length; i++) {
if (req.url.indexOf(routes.api.logged[i]) > -1) {
break;
}
}
if (i == routes.api.logged.length) {
return res.sendStatus(403);
} else {
next();
}
})
.catch(function (err) {
return res.sendStatus(403);
});
}
// END REGION: API permissions (logged)
} else {
// START REGION: Views permissions (all)
cookie.verifySession(req.cookies.session)
.catch(function (err) {
if (res.statusCode == null) {
return res.redirect('/forbidden');
}
});
for (i = 0; i < routes.views.all.length; i++) {
if (routes.views.all[i].indexOf(req.url) > -1) {
break;
}
}
if (i != routes.views.all.length) {
next();
} else {
// END REGION: Views permissions (all)
// START REGION: Views permissions (logged)
cookie.verifySession(req.cookies.session)
.then(function (userId) {
for (i = 0; i < routes.views.logged.length; i++) {
if (req.url.indexOf(routes.views.logged[i]) > -1) {
break;
}
}
if (i == routes.views.logged.length) {
if (res.statusCode == null) {
return res.redirect('/forbidden');
}
} else {
next();
}
});
}
// END REGION: Views permissions (logged)
}
next();
}
}());
我有一個輔助文件,我添加了permitions:
{
"api":{
"all": [
"/api/authenticate",
"/api/user"
],
"logged": [
"/api/lessons"
],
"admin": [
]
},
"views":{
"all": [
"/",
"/user_management"
],
"logged": [],
"admin": [],
"advanced": []
}
}
因為這回答了你的問題,我會對答案做出評論:
在我看來,你的中間件可以不止一次調用next()
。
你在中間件函數的末尾調用next()
。 因此,在此之前沒有達到返回的任何代碼路徑都將觸及next()
。 但是其他一些代碼路徑也有自己的next()
調用。 這是一個雙重調用。 基本上,您的中間件沒有正確地考慮其異步操作,並且沒有唯一的邏輯路徑,只會導致每個請求只調用next()
或res.redirect()
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.