【问题标题】:firebase.update() causing nodejs server to crash: Can't set headers after they are sentfirebase.update()导致nodejs服务器崩溃:发送后无法设置标头
【发布时间】:2015-11-01 14:04:15
【问题描述】:

我正在尝试从 nodejs 中的 server.js 文件中更新 firebase 位置。使用 firebase api 中的 .update() 会导致应用程序崩溃并抛出错误“发送后无法设置标头”。如果我注释掉更新 firebase 位置的代码,则没有错误。有人知道这是什么原因吗?

导致错误的代码:

app.post('/updateFire', function(req,res){
    var updateInfo = req.body;
    console.log(updateInfo);
    var onComplete = function(error) {
        if (error) {
            console.log('Synchronization failed');
        } else {
            console.log('Synchronization succeeded');
            res.json('done');
        }
    };
    ref.update({points:updateInfo.points,totalAmount:updateInfo.totalAmount}, onComplete);
});

但是,如果您取出该代码并对客户端进行简单的响应,它不会抛出错误:

app.post('/updateFire', function(req,res){
    var updateInfo = req.body;
    console.log(updateInfo);
    res.json('done');
});

导致崩溃的 firebase .update() 是什么原因?

从 FIREBASE 控制台更新错误

我猜控制台从 firebase 输出错误:

FIREBASE WARNING: Exception was thrown by user callback. Error: Can't set headers after they are sent.
    at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:335:11)
    at ServerResponse.header (/Users/chaselester/Sites/Development/chore-tracker/chore-angular/node_modules/express/lib/response.js:695:10)
    at ServerResponse.send (/Users/chaselester/Sites/Development/chore-tracker/chore-angular/node_modules/express/lib/response.js:146:12)
    at ServerResponse.json (/Users/chaselester/Sites/Development/chore-tracker/chore-angular/node_modules/express/lib/response.js:235:15)
    at /Users/chaselester/Sites/Development/chore-tracker/chore-angular/app.js:36:13
    at /Users/chaselester/Sites/Development/chore-tracker/chore-angular/node_modules/firebase/lib/firebase-node.js:49:642
    at Ab (/Users/chaselester/Sites/Development/chore-tracker/chore-angular/node_modules/firebase/lib/firebase-node.js:46:165)
    at wb (/Users/chaselester/Sites/Development/chore-tracker/chore-angular/node_modules/firebase/lib/firebase-node.js:22:216)
    at xb (/Users/chaselester/Sites/Development/chore-tracker/chore-angular/node_modules/firebase/lib/firebase-node.js:21:1260)
    at Qh.g.update (/Users/chaselester/Sites/Development/chore-tracker/chore-angular/node_modules/firebase/lib/firebase-node.js:204:471) 
/Users/chaselester/Sites/Development/chore-tracker/chore-angular/node_modules/firebase/lib/firebase-node.js:46
ion(){P("Exception was thrown by user callback.",b.stack||"");throw b;},Math.f

堆栈跟踪错误:

stack trace:  Error
    at /Users/chaselester/Sites/Development/chore-tracker/chore-angular/app.js:56:17
    at Layer.handle [as handle_request] (/Users/chaselester/Sites/Development/chore-tracker/chore-angular/node_modules/express/lib/router/layer.js:82:5)
    at next (/Users/chaselester/Sites/Development/chore-tracker/chore-angular/node_modules/express/lib/router/route.js:110:13)
    at Route.dispatch (/Users/chaselester/Sites/Development/chore-tracker/chore-angular/node_modules/express/lib/router/route.js:91:3)
    at Layer.handle [as handle_request] (/Users/chaselester/Sites/Development/chore-tracker/chore-angular/node_modules/express/lib/router/layer.js:82:5)
    at /Users/chaselester/Sites/Development/chore-tracker/chore-angular/node_modules/express/lib/router/index.js:267:22
    at Function.proto.process_params (/Users/chaselester/Sites/Development/chore-tracker/chore-angular/node_modules/express/lib/router/index.js:321:12)
    at next (/Users/chaselester/Sites/Development/chore-tracker/chore-angular/node_modules/express/lib/router/index.js:261:10)
    at /Users/chaselester/Sites/Development/chore-tracker/chore-angular/node_modules/express/lib/router/index.js:603:15
    at next (/Users/chaselester/Sites/Development/chore-tracker/chore-angular/node_modules/express/lib/router/index.js:246:14)

【问题讨论】:

  • 这是一个异步问题,代码在响应发送后尝试做一些事情。
  • 您确定第一个代码块是您为app.post() 请求处理程序提供的所有实际代码吗?因为您收到的错误类型来自对异步响应的错误处理,但我在您披露的代码中没有看到这种类型的错误。
  • 是的,这就是 app.post() 请求中的所有内容
  • 那么,显然你的数据库搞砸了,错误来自你的数据库代码。
  • 我的猜测是,您设置了某种回调或事件处理程序来获取数据库中某些内容的通知,并且您正在尝试发送响应或在该回调中设置标头(即导致这个问题)。这可能是一个 Firebase .on() 事件处理程序,您希望将其用于其他一些操作,但不知道此更新会触发该事件处理程序。

标签: javascript node.js server firebase


【解决方案1】:

根据我的经验(同样的错误),您必须在代码中的某处使用 .on('value',fn) 方法从 Firebase 读取数据。您应该将其更改为 .once('value',fn)。因为 .on('value',fn) 方法会在您 .update() Firebase 上的数据时让您返回,并且可能会再次尝试 res.send({}) 。这就是为什么您收到“发送后无法设置标头”错误的原因。

【讨论】:

    猜你喜欢
    • 2015-12-20
    • 2016-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 2014-08-23
    相关资源
    最近更新 更多