Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/440.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js错误:';Can';t在发送标题后设置标题';在岗_Javascript_Node.js_Express_Post_Nunjucks - Fatal编程技术网

Javascript Node.js错误:';Can';t在发送标题后设置标题';在岗

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

好的,这个话题在stackoverflow上已经被回答了很多次,但是我没有发现任何对我有用的东西

我已经设置了一个nodejs服务器,“get”查询可以正常工作,但是当我试图发布时,我收到了这个错误,它被写为“cannotpost/fr/login”(url是domain.com/fr/login)

正如你所知,我使用Express、i18n和Nunjucks作为模板引擎

我真的不知道发生了什么事。我试图建立一个登录系统,但这阻止了我这么做。基本情况是,用户输入信息,然后我用邮件和密码调用
user.findOne
,然后它会触发回调,并出现错误(成功登录被视为错误)。目前,它执行回调并将用户信息“传输”到回调。(您可能会在回调中看到一个
console.log
,它正在工作)。但是当它触发res.render时,我得到了两个错误

这是我的档案:

  • 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 });
              }
            });
          }
        });
      });
    
  • 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});
      });
     }
    }
    
  • 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;
        }
    };
    }
    };
    
  • 这是我的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)
    

  • 同一个问题我已经面对过很多次了。对我来说,这个错误发生过两次:

  • 当我发送响应时,一次回调中有多个响应
  • 当我无法在回调中设置正确的查询结果条件,以便在获得结果后执行其他语句时

  • 你能不能也在app.js上贴一个只包含路由调用的@Willbill360

    我发现了我的问题所在。查询多次返回结果,因此多次调用回调


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

    尝试在res.send语句之后添加显式return语句。我也遇到了同样的问题,这对我很有帮助。我的server.js是app.js,我为server.js发布的唯一代码是发布路线。你确定
    getChangelog
    getAlert
    中间件不会发送一些数据吗?另外,当
    data.email
    data.password
    中的一个
    user.js
    中为空时,您没有
    回调
    。我知道,在处理空变量之前,我正试图使其工作。是的,我确信中间产品不是问题的原因。