Javascript Node.js错误:';Can';t在发送标题后设置标题';在岗
好的,这个话题在stackoverflow上已经被回答了很多次,但是我没有发现任何对我有用的东西 我已经设置了一个nodejs服务器,“get”查询可以正常工作,但是当我试图发布时,我收到了这个错误,它被写为“cannotpost/fr/login”(url是domain.com/fr/login) 正如你所知,我使用Express、i18n和Nunjucks作为模板引擎 我真的不知道发生了什么事。我试图建立一个登录系统,但这阻止了我这么做。基本情况是,用户输入信息,然后我用邮件和密码调用Javascript Node.js错误:';Can';t在发送标题后设置标题';在岗,javascript,node.js,express,post,nunjucks,Javascript,Node.js,Express,Post,Nunjucks,好的,这个话题在stackoverflow上已经被回答了很多次,但是我没有发现任何对我有用的东西 我已经设置了一个nodejs服务器,“get”查询可以正常工作,但是当我试图发布时,我收到了这个错误,它被写为“cannotpost/fr/login”(url是domain.com/fr/login) 正如你所知,我使用Express、i18n和Nunjucks作为模板引擎 我真的不知道发生了什么事。我试图建立一个登录系统,但这阻止了我这么做。基本情况是,用户输入信息,然后我用邮件和密码调用use
user.findOne
,然后它会触发回调,并出现错误(成功登录被视为错误)。目前,它执行回调并将用户信息“传输”到回调。(您可能会在回调中看到一个console.log
,它正在工作)。但是当它触发res.render时,我得到了两个错误
这是我的档案:
app.post('/:lang/login', getChangelog, getAlert, function(req, res) {
i18n.setLocale(req, req.params.lang);
let version;
if(req.cookies.version) {
version = req.cookies.version;
}
if(!version) version = 0;
var email = req.body.mailconnect;
var password = req.body.mdpconnect;
User.findOne({ email: email, password: password }, function(err, user){
if(user['error'] != "LOGIN OK") {
console.log(user);
errorInfo['showError'] = true;
errorInfo['error-msg'] = req.__("Error-WrongMail");
res.render('login/login.njk', { title: req.__('Login-PageTitle'),
style: 'login.css', alertInfo: alertInfo, errorInfo: errorInfo, version: version, currVersion: currVersion, firstVersion: firstVersion, changelog: changelog });
} else {
var hash = user["mdp"];
hash = hash.replace(/^\$2y(.+)$/i, '$2a$1');
bcrypt.compare(password, hash, function(err, res2) {
if(res2){
errorInfo['showError'] = false;
errorInfo['error-msg'] = "LOGIN OK";
res.redirect(i18n.getLocale + '/agent/' + user["id"] + '/selectservice');
} else{
errorInfo['showError'] = true;
errorInfo['error-msg'] = req.__("Error-MailAndPassNoMatch");
res.render('login/login.njk', { title: req.__('Login-PageTitle'), style: 'login.css', alertInfo: alertInfo, errorInfo: errorInfo, version: version, currVersion: currVersion, firstVersion: firstVersion, changelog: changelog });
}
});
}
});
});
var db = require('../other/mysql.js');
exports.findOne = (data, callback) => {
if(data.email != "" && data.password != "") {
db.connection.query('SELECT * FROM membres WHERE mail = ?', data.email)
.on('result', function (row) {
let user = new Object();
user = row;
user['error'] = 'WrongMail'; //Temporary, just for testing
callback(null, user);
})
.on('error', function (err) {
let user = new Object();
user['error'] = 'SQL';
callback(err, user});
});
}
}
var mysql = require('mysql');
var pool = mysql.createPool({
connectionLimit : 10,
host: "ip",
user: "user",
password: "password",
database: "databse"
});
exports.connection = {
query: function () {
var queryArgs = Array.prototype.slice.call(arguments),
events = [],
eventNameIndex = {};
pool.getConnection(function (err, conn) {
if (err) {
if (eventNameIndex.error) {
eventNameIndex.error();
}
}
if (conn) {
var q = conn.query.apply(conn, queryArgs);
q.on('end', function () {
conn.release();
});
events.forEach(function (args) {
q.on.apply(q, args);
});
}
});
return {
on: function (eventName, callback) {
events.push(Array.prototype.slice.call(arguments));
eventNameIndex[eventName] = callback;
return this;
}
};
}
};
RowDataPacket {
id: 1,
mail: 'mymail',
matricule: '972',
mdp: 'an hashed password',
num_vehicle: 8001,
profession: 'agent',
dispatch: 'Y',
supervisor: 'Y',
admin: 'Y',
status: 1,
tkn: '3faixj17guocz89zfdx5a9',
serv: '',
error: 'WrongMail' }
Caught exception: Error: Can't set headers after they are sent.
at validateHeader (_http_outgoing.js:491:11)
at ServerResponse.setHeader (_http_outgoing.js:498:3)
at ServerResponse.header (F:\GitHub\terminal.ga\node_modules\express\lib\response.js:730:10)
at ServerResponse.send (F:\GitHub\terminal.ga\node_modules\express\lib\response.js:170:12)
at done (F:\GitHub\terminal.ga\node_modules\express\lib\response.js:967:10)
at F:\GitHub\terminal.ga\node_modules\nunjucks\src\environment.js:37:5
at RawTask.call (F:\GitHub\terminal.ga\node_modules\asap\asap.js:40:19)
at flush (F:\GitHub\terminal.ga\node_modules\asap\raw.js:50:29)
at _combinedTickCallback (internal/process/next_tick.js:131:7)
at process._tickCallback (internal/process/next_tick.js:180:9)
同一个问题我已经面对过很多次了。对我来说,这个错误发生过两次:
你能不能也在app.js上贴一个只包含路由调用的@Willbill360我发现了我的问题所在。查询多次返回结果,因此多次调用回调
为了解决这个问题,我创建了一个新的导出,它只需要从池中获取一个连接并执行一个查询,就像在文档中一样。一种非常简单的方法来确保它不会多次发送数据。尝试在res.send语句之后添加显式return语句。我也遇到了同样的问题,这对我很有帮助。我的server.js是app.js,我为server.js发布的唯一代码是发布路线。你确定
getChangelog
或getAlert
中间件不会发送一些数据吗?另外,当data.email
或data.password
中的一个在user.js
中为空时,您没有回调
。我知道,在处理空变量之前,我正试图使其工作。是的,我确信中间产品不是问题的原因。