快递"发送后不能设置标题"部署到Heroku后

时间:2017-09-25 21:13:13

标签: express

将我的服务器代码部署到Heroku之后我收到错误"发送后不能设置标头"。我获取登录数据

   fetch("url", {
                method: "POST",
                mode: "cors",
                headers: {
                    "Accept": "application/json",
                    "Content-Type": "application/x-www-form-urlencoded"
                    //"Content-Type": "application/json"
                },
                body: requestBody
            }).then((res, next) => {
                if(res.ok){
                    res.json().then((json) => {
                        if(json.verifystate){
                            this.props.navigation.navigate('Home')
                        }
                        else{
                          this.setState({isAuthentic:false});
                        }
                    });
                }else{
                    next();
                }
            })

它调用我的服务器post方法

  app.post('/users/auth', function(req, res) {

        loginData(db, req.body.email, req.body.password, req.body.mphone, function(result){
          if(result == 1){
            res.send({"verifystate":1});
          }else if(result == 2){
            res.send({"verifystate":2});
          }else{
            res.send({"verifystate":3});
          }
        });
        //console.log('json: '+JSON.stringify(data));
    });

编辑:登录功能

    module.exports = function loginData(db, email, myPlaintextPassword, mphone, callback){

    var collectionUser = db.collection('users');

    bcrypt.genSalt(saltRounds, function(err, salt) {
    bcrypt.hash(myPlaintextPassword, salt, function(err, hash) {

        var queryStr = {"emails.address": email};

        collectionUser.findOne(queryStr, function(err, result) {
                if(err)
                {
                    return;
                }else if(result != null){

                    bcrypt.compare(myPlaintextPassword, result.services.password.bcrypt, function(err, res) {
                        console.log("conpare result: ", res);
                        if(res){
                            callback("1");
                        }else{
                            callback("3");
                        }

                    });
                    if(!result.services.resume || result.services.resume.appLoginToken == null
                      || !result.services.resume.appLoginToken.date || !result.services.resume.appLoginToken.base64Token){

                        var tokenStr = email + Math.random(1,100);
                        tokenStr = Base64.encode(tokenStr);
                        queryStr =  {
                                      "services.resume.appLoginToken.date": Date(),
                                      "services.resume.appLoginToken.base64Token": tokenStr
                                    };
                        var newDate =   { "services.resume.appLoginToken.date": Date() }
                        var temp = {"emails.address": email};
                        collectionUser.update(temp,
                          { $set: {"services.resume.appLoginToken.date": Date()} }, function(err, result) {
                        if(err)
                            {
                                return;
                            }else {
                            }
                        });
                        collectionUser.update(temp,
                          { $set: {"services.resume.appLoginToken.base64Token": tokenStr} }, function(err, result) {
                        if(err)
                            {
                                return;
                            }else {
                            }
                        });
                    }else{
                        console.log("already have token");
                    }
                }else{
                    callback("2")
                }
        });
    });
});

};

当它到达 res.send({" verifystate:" 1})时,它会抛出上述错误。任何帮助都会非常感谢。

2 个答案:

答案 0 :(得分:0)

if(!res.headersSent){
  res.send('hello world');
}

if(!res.headersSent){
  res.json({message: 'hello world'});
}

你可能有一个不止一次触发的回调,通常是事件发射器。

作为旁注,我真的建议使用2个空格来缩进JS,因为嵌套了很多代码。我还建议将else.then()放在换行符上,更具可读性。

答案 1 :(得分:0)

我没有阅读整个代码,但你可以试试这个:

module.exports = function loginData(db,email,myPlaintextPassword,mphone,callback){

let collectionUser = db.collection('users');

bcrypt.genSalt(saltRounds, function (err, salt) {
    bcrypt.hash(myPlaintextPassword, salt, function (err, hash) {

        let queryStr = {"emails.address": email};

        collectionUser.findOne(queryStr, function (err, result) {
            if (err) {
                //You should do something here or it would take you to an error , just an return won't work, you've to call a callback that send the error message 
                //callback(0)
            } else if (result !== null) {

                if (!result.services.resume || result.services.resume.appLoginToken === null
                    || !result.services.resume.appLoginToken.date || !result.services.resume.appLoginToken.base64Token) {

                    let tokenStr = email + Math.random(1, 100), temp = {"emails.address": email};
                    tokenStr = Base64.encode(tokenStr);
                    queryStr = {
                        "services.resume.appLoginToken.date": new Date(),
                        "services.resume.appLoginToken.base64Token": tokenStr
                    };
                    collectionUser.update(temp,
                        {$set: {"services.resume.appLoginToken.date": new Date()}}, function (err, result) {
                        });
                    collectionUser.update(temp,
                        {$set: {"services.resume.appLoginToken.base64Token": tokenStr}}, function (err, result) {
                        });
                } else {
                    console.log("already have token");
                }
                bcrypt.compare(myPlaintextPassword, result.services.password.bcrypt, function (err, res) {
                    console.log("conpare result: ", res);
                    if (res) {
                        callback(1);
                    } else {
                        callback(3);
                    }
                });
            } else {
                callback(2);
            }
        });
    });
})

};

而且:

app.post('/users/auth', function (req, res) {
    loginData(db, req.body.email, req.body.password, req.body.mphone, function (result) {
        res.send({verifystate: result});
    });
});