firebase.update()导致Node.js服务器崩溃:无法在发送后设置头文件。

3
我正在尝试从我的nodejs的server.js文件中更新firebase位置。使用firebase api中的.update()会导致应用程序崩溃并抛出错误“Can't set headers after they are sent”。如果我注释掉更新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()请求处理程序的全部实际代码吗?因为你得到的错误类型来自于异步响应处理不当,但我在你披露的代码中没有看到这种错误。 - jfriend00
是的,这就是在app.post()请求中的所有内容。 - Chipe
那么,我认为你看到的错误实际上来自其他代码。我不明白这段代码本身如何会导致该错误。 - jfriend00
1
那么,显然你的数据库出了问题,错误来自于你的数据库代码。 - jfriend00
2
我的猜测是你设置了某种回调或事件处理程序来接收数据库中的某些通知,并且你正在尝试在该回调中发送响应或设置标头(这可能会导致问题)。这可能是一个 Firebase 的 .on() 事件处理程序,你希望它在某些其他操作中生效,但不知道会在此更新时触发。 - jfriend00
显示剩余10条评论
1个回答

0

根据我的经验(相同的错误),你必须在你的代码中某个地方使用 .on('value',fn)方法从Firebase读取数据。你应该将其更改为.once('value',fn)。因为当你在Firebase上.update()数据时,.on('value',fn) 方法会使你返回并可能再次尝试 res.send({})。这就是为什么你会收到“Can't set headers after they are sent”错误的原因。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接