gpt4 book ai didi

javascript - NodeJS 未处理的拒绝错误 : Can't set headers after they are sent

转载 作者:可可西里 更新时间:2023-11-01 07:17:44 24 4
gpt4 key购买 nike

我最近参与了一个 nodejs 项目,在尝试在我的数据库访问和路由之间使用 promises 时,我遇到了错误发送后无法设置 header 回复 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()每个请求一次。

关于javascript - NodeJS 未处理的拒绝错误 : Can't set headers after they are sent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37094253/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com