FIREBASE WARNING: Exception was thrown by user callback.

前言

這陣子使用 firebase 開發一個簡單系統遇到一個錯誤 Exception was thrown by user callback,這邊紀錄一下發生原因

錯誤訊息

首先先記錄一下重點錯誤訊息

1
[2019-07-03T01:56:21.311Z]  @firebase/database: FIREBASE WARNING: Exception was thrown by user callback. Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client

程式碼錯誤

接下來下方是我撰寫的練習用程式碼

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
router.post('/create', function(req, res, next) {
var fireRef = firebaseAdmin.ref('todo').push();
var fireGetRef = firebaseAdmin.ref('todo');
var data = {
content: req.body.content
}
fireRef.set(data).then(function(){
fireGetRef.once('value', function (snapshot) {
res.send({
success: true,
result: snapshot.val(),
massage: '新增資料成功'
});
})
})
res.end();
});

問題主要出在 res.end(); 放的位置不對導致錯誤,所以正確位子應該這樣放

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
router.post('/create', function(req, res, next) {
var fireRef = firebaseAdmin.ref('todo').push(); // 設定路徑,並使用 push() 確保唯一值
var fireGetRef = firebaseAdmin.ref('todo');
var data = {
content: req.body.content
}
fireRef.set(data).then(function(){
fireGetRef.once('value', function (snapshot) {
res.send({
success: true,
result: snapshot.val(),
massage: '新增資料成功'
});
})
})
});

原因是因為 Node.js 搞不清楚你到底要不要回傳資料給客戶端,簡單來講就是打架哩

科普一下 res.end & res.send

順便科普記錄一下這兩者是什麼東西

res.send

res.send 最簡單,簡單講就是伺服器要回傳給客戶端的資料時就要使用 res.send()

res.end

res.end 意思就是指,當沒有要回傳資料給客戶端時就結束

另外不要使用 另外不要使用來回傳資料,這影響效能問題。

那 res.send 後面一定要加上 res.end 嗎?

其實可以不用加上 res.end(),當若使用 res.send() 就可以不用使用 res.end()

Liker 讚賞

這篇文章如果對你有幫助,你可以花 30 秒登入 LikeCoin 並點擊下方拍手按鈕(最多五下)免費支持與牡蠣鼓勵我。
或者你可以也可以請我「喝一杯咖啡(Donate)」。

Buy Me A Coffee Buy Me A Coffee

Google AD

撰寫一篇文章其實真的很花時間,如果你願意「關閉 Adblock (廣告阻擋器)」來支持我的話,我會非常感謝你 ヽ(・∀・)ノ