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 讚賞 (拍手)

如果這一篇筆記文章對你有幫助,希望可以求點支持或 牡蠣 鼓勵 (ノД`)・゜・。

Liker 是一個按讚(拍手)的讚賞機制,每一篇文章最多可以按五下(拍手),按讚過程你是完全不用付費的(除非你想要每個月贊助我 :D),你只需要登入帳號就可以開始按讚。
而 Liker 會依據按讚數量分配獎金給創作者,所以如果你願意按個讚我會非常感謝你唷。

Google AD

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