当我取消注释一行代码时,我收到此错误:_http_outgoing.js:359 抛出新的错误("发送后无法设置标头。



当我在下面的代码中取消注释这一行:return done(null, false, { message: 'Incorrect username' });时,Node.js运行时没有任何错误,否则Node.js会给出后面提到的错误:

//we need to define a local Strategy to authenticate with username and password
passport.use(new LocalStrategy(
function(username, password, done) { //start of custom code
//from here starts our custom code (inside this function scope)
//outside this scope is from passport API documentation
//process.nextTick(function() {
UserFind(username, function(err, user) {
if (err) {
return done(err);
} else if (!user || user.length == 0) {
//When I uncomment the following line of code, an error occurs, but when I comment out the following, no error is received:
//return done(null, false, { message: 'Incorrect username' });
} else {
console.log('user._id:' + user._id);
console.log('typeof user: ' + typeof(user));
console.log('user.username: ' + user.username);
console.log('user.password: ' + user.password);
if (password !== user.password) {
return done(null, false, { message: 'Incorrect password' });
}
return done(null, user);
}
})
//}) //process.nextTick
} //end of custom code
));

当我取消注释上述行时收到的错误:

_http_outgoing.js:359throw new Error("发送邮件头后无法设置邮件头。");^

错误:发送邮件头后无法设置邮件头。位于ServerResponse.setHeader(_http_outgoing.js:359:11)在ServerResponse.header(/home/ict/Documents/hookahDB/serverjs/node_modules/express/lib/response.js:719:10)位于ServerResponse.location(/home/ict/Documents/hookahDB/serverjs/node_modules/express/lib/response.js:836:15)位于ServerResponse.redirect(/home/ict/Documents/hookahDB/serverjs/node_modules/express/lib/response.js:874:18)根本失败(/home/ict/Documents/whookahDB/serverjs/node_modules/passport/lib/middleware/authenticate.js:132:20)在尝试时(/home/ict/Documents/whookahDB/serverjs/nod_modules/papassport/lib/middleware/authenticate.js:167:28)在Strategy.Strategy.fail(/home/ict/Documents/whookahDB/serverjs/node_modules/passport/lib/middleware/authenticate.js:284:9)在已验证的位置(/home/ict/Documents/hookahDB/serverjs/nod_module/paassword local/lib/strategy.js:82:30)在/home/ict/Documents/whookahDB/serverjs/index.js:158:28在/home/ict/Documents/whookahDB/serverjs/index.js:144:16

我想知道为什么那一行是错误的原因,以及我如何解决它。谢谢。

编辑

回调功能如下:

function UserFind(username, cb) {
db.view('users/by_username', function(err, res) {
if (err) {
//db.view returned error
return cb(err);
}
res.forEach(function(key, value, id) {
//1st input=key|username, 2nd input=value|userDocument, 3rd input=id|_id
//console.log('key: '+key+' row: '+row+' id: '+ id);
if (username === key) {
//found the user
return cb(false, value);
}
})
//couldn't find the user by forEach loop
return cb(false, false);
})
}

该错误消息是由异步响应处理中的定时错误引起的,该错误导致您在发送响应后尝试在响应上发送数据。

当人们将快速路由中的异步响应视为同步响应,并最终发送两次数据时,通常会发生这种情况。

您应该在您的报表中添加其他内容

if (password !== user.password) {
return done(null, false, { message: 'Incorrect password' });
} else {
return done(null, user);
}

更新:

function UserFind(username, cb) {
var userFound = false, userVal = "";
db.view('users/by_username', function(err, res) {
if (err) {
//db.view returned error
return cb(err);
}
res.forEach(function(key, value, id) {
//1st input=key|username, 2nd input=value|userDocument, 3rd input=id|_id
//console.log('key: '+key+' row: '+row+' id: '+ id);
if (username === key) {
//found the user
userFound = true;
userVal = value;
}
});
if (userFound) {
return cb(false, userVal);
} else {
// User did not found
return cb(false, false);
}
})
}

最新更新