繁体   English   中英

Node.js错误:“在发送标头后无法设置标头”

[英]Node.js error: 'Can't set headers after they are sent' on post

好的,这个话题已经在stackoverflow上得到了很多回答,但是我发现没有什么对我有用。

我已经安装了一个nodejs服务器,并且“ get”查询工作正常,但是当我尝试发布时,出现此错误,它被写为“ Cannot post / fr / login”(URL为domain.com/fr/login )

大家知道,我使用Express,i18n和Nunjucks作为模板引擎。

我真的不知道发生了什么。 我正在尝试制作一个登录系统,但这阻止了我这样做。 令人费解的是,这是用户输入的信息,然后我用邮件和密码调用User.findOne ,然后它应该触发回调并发生错误(成功登录被视为错误)。 当前,它会回调并“转移”到回调用户信息。 (您可能在回调中看到console.log ,它正在工作)。 但是当它触发res.render时,我得到了两个错误。

这是我的文件:

  1. server.js

     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 }); } }); } }); }); 
  2. user.js

     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}); }); } } 
  3. mysql.js

     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; } }; } }; 
  4. 这是我的nodejs日志

     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) 

我面临同样的问题很多次。对我来说,这个错误发生了两次:

  1. 当我发送响应不止一个回调。
  2. 当我无法在回调中设置正确的查询结果条件时,无法在获取结果后执行其他语句。

你可以只通过@ Willbill360发布带有该路由调用的app.js吗

我发现了我的问题所在。 该查询返回的结果比准时更多,因此它多次调用该回调。

为了解决这个问题,我创建了一个新的导出,仅从池中获得连接并像在文档中一样执行查询。 一种非常简单的方法,可以确保它不会多次发送数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM