【问题标题】:Express & Firebase can't set header after they are sentExpress & Firebase 发送后无法设置标头
【发布时间】:2018-07-14 10:43:06
【问题描述】:

以下是我的服务器使用 express 框架,反手有 firebase api

我有两个问题,即为什么我的函数被调用了两次,错误是什么

 app.get('/user/:userID/profile/edit', function(req, res) {
  var authData = ref.getAuth();
  var str = (req.query.message == undefined ? "" : req.query.message);
  if(authData) {
    if(req.params.userID == authData.uid){
      ref.child("users").child(authData.uid).on("value",function(snapshot) {
        var userData = snapshot.val();
        res.render('Profile/edit', {
          title : "Price Drop Alert",
          pagetitle : "Profile",
          firstname : userData.firstname,
          lastname : userData.lastname,
          dob : userData.dob,
          tel : userData.tel,
          email : userData.email,
          uid : authData.uid,
          message : str
        });
      });
    }
    else
      res.sendStatus(404);
  }
  else
    res.redirect('/?message='+encodeURIComponent("User is not logged in"));
});

app.post('/user/:userID/profile/edit', function(req,res) {
  var uid = req.params.userID;
  if(req.body.fsubmit == "Submit"){
    ref.child("users").child(uid).update({
      firstname : req.body.fname
    });
    console.log("update");
    res.redirect('/user/'+req.params.userID+"/profile/edit");
  }
});

以下是我得到的错误

  update
Error: Can't set headers after they are sent.
    at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:346:11)
    at ServerResponse.header (/home/saunish/WebstormProjects/priceDrop/node_modules/express/lib/response.js:718:10)
    at ServerResponse.send (/home/saunish/WebstormProjects/priceDrop/node_modules/express/lib/response.js:163:12)
    at done (/home/saunish/WebstormProjects/priceDrop/node_modules/express/lib/response.js:957:10)
    at View.exports.renderFile [as engine] (/home/saunish/WebstormProjects/priceDrop/node_modules/ejs/lib/ejs.js:355:10)
    at View.render (/home/saunish/WebstormProjects/priceDrop/node_modules/express/lib/view.js:126:8)
    at tryRender (/home/saunish/WebstormProjects/priceDrop/node_modules/express/lib/application.js:639:10)
    at EventEmitter.render (/home/saunish/WebstormProjects/priceDrop/node_modules/express/lib/application.js:591:3)
    at ServerResponse.render (/home/saunish/WebstormProjects/priceDrop/node_modules/express/lib/response.js:961:7)
    at /home/saunish/WebstormProjects/priceDrop/app.js:130:13
Error: Can't set headers after they are sent.
    at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:346:11)
    at ServerResponse.header (/home/saunish/WebstormProjects/priceDrop/node_modules/express/lib/response.js:718:10)
    at ServerResponse.send (/home/saunish/WebstormProjects/priceDrop/node_modules/express/lib/response.js:163:12)
    at done (/home/saunish/WebstormProjects/priceDrop/node_modules/express/lib/response.js:957:10)
    at View.exports.renderFile [as engine] (/home/saunish/WebstormProjects/priceDrop/node_modules/ejs/lib/ejs.js:355:10)
    at View.render (/home/saunish/WebstormProjects/priceDrop/node_modules/express/lib/view.js:126:8)
    at tryRender (/home/saunish/WebstormProjects/priceDrop/node_modules/express/lib/application.js:639:10)
    at EventEmitter.render (/home/saunish/WebstormProjects/priceDrop/node_modules/express/lib/application.js:591:3)
    at ServerResponse.render (/home/saunish/WebstormProjects/priceDrop/node_modules/express/lib/response.js:961:7)
    at /home/saunish/WebstormProjects/priceDrop/app.js:168:13

【问题讨论】:

标签: node.js express firebase


【解决方案1】:

你需要将on()方法更改为once(),否则每次数据更新时都会触发你的回调函数,

【讨论】:

    【解决方案2】:

    在此行中使用once 而不是on

    ref.child("users").child(authData.uid).on("value",function(snapshot)
    

    应该是这样的:

    ref.child("users").child(authData.uid).once("value",function(snapshot)
    

    我今天遇到了这个问题,我就是这样解决的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-05
      • 2017-08-11
      • 2016-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 2017-03-03
      相关资源
      最近更新 更多