NodeJS未处理的拒绝错误:Can't在发送标头后设置标头
NodeJS Unhandled rejection error: Can't set headers after they are sent
我最近参与了一个nodejs项目,当我试图在数据库访问和路由之间使用promise时,我遇到了错误在请求响应时无法设置发送后的头http://localhost:8080/api/user。虽然我知道栈中有很多解决方案,但没有一个对我有用,所以下面是我在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();
}
}());
我有一个添加权限的辅助文件:
{
"api":{
"all": [
"/api/authenticate",
"/api/user"
],
"logged": [
"/api/lessons"
],
"admin": [
]
},
"views":{
"all": [
"/",
"/user_management"
],
"logged": [],
"admin": [],
"advanced": []
}
}
我会把我的评论变成一个答案,因为这回答了你的问题:
在我看来,您的中间件可以多次调用next()
。
您在中间件函数的末尾调用next()
。因此,任何在此之前没有返回的代码路径都将返回next()
。但其他一些代码路径也有自己对next()
的调用。这是双重要求。基本上,您的中间件没有正确地考虑其异步操作,也没有唯一的逻辑路径,导致每个请求只调用next()
或res.redirect()
一次。
相关文章:
- NodeJS未处理的拒绝错误:Can't在发送标头后设置标头
- href属性在页面加载后拒绝重新设置
- 拒绝在框架中显示,因为它设置了'X-Frame-Options'到'拒绝'在JavaSc
- Mootools:拒绝设置不安全的标头“;连接”;
- 业务催化剂原型核心.ashx 拒绝设置不安全的标头“连接”冲突
- 拒绝设置不安全的标头“日期”AngularJS
- 拒绝在帧中显示,因为它将“X帧选项”设置为“SAMEORIGIN”
- 设置文档域时出现“访问被拒绝”错误
- 设置选项接受一个数字变量,拒绝另一个数字变量
- 拒绝显示,请将X-Frame-Options设置为SAMEORIGIN
- PhoneGap中的Cookie标头:拒绝设置不安全的标头“;Cookie”;
- 拒绝显示'在帧中,因为它设置了'X-Frame-Options'到'否认'.在通
- 当颜色在CSS中特别设置时,Mootools拒绝元素子元素的颜色转换
- 拒绝显示'http://vimeo.com/27577981'在帧中,因为它设置了'X-Fram
- 获取错误拒绝显示'http://www.asp.net/'在帧中,因为它设置了'X-Frame-
- 未处理的拒绝错误:发送后不能设置标头
- Ajax请求:拒绝设置不安全的标头
- AngularJS拒绝设置不安全的header " cookie &;
- 跨子域ajax请求被拒绝,即使文档.正确设置域
- 如何处理“拒绝设置不安全标头:连接”