[英]Node Express Can't set headers after they are sent
我知道已經以多種方式提出了這個問題,但是我的問題似乎與已經發布的問題有所不同。
我正在嘗試將數據從表單發送到Google Firebase。 我有一個使用Express的節點應用程序。
這是我將數據發送到firebase的功能:
function validateForm() {
async.series([
function (callback) {
var errors = "<strong>The following errors were entered:\n";
var name = $('#name').val();
var story = $('#story').val();
if (name.length < 1) {
errors += "\n-Please enter a valid name";
callback("Please enter a valid name", null);
}
if (story.length < 1) {
errors += "\n-Please enter a valid story";
callback("Please enter a valid story", null);
}
console.log("FInished validating");
callback(null, "finished validating");
}, function (callback) {
firebase.database().ref('stories/' + Date.now()).set({
name: name,
story: story
}, function() {
console.log("Firebase callback");
callback(null, "sent data!");
});
}, function (callback) {
console.log("Finished!");
callback(null, "done")
}
])
}
(為了清楚起見,添加了一些console.logging以確保我的回調正確)
通過單擊樣式看起來像按鈕的div觸發提交,因此我知道沒有導致問題的表單問題的默認行為。 以下是我在Node中遇到的錯誤。
錯誤:/Users/keegan/WebstormProjects/hack4health/views/error.hbs:發送標頭后無法設置標頭。 在ServerResponse.send(/ Users)的ServerResponse.header(/Users/keegan/WebstormProjects/hack4health/node_modules/express/lib/response.js:719:10)的ServerResponse.OutgoingMessage.setHeader(_http_outgoing.js:356:11) /keegan/WebstormProjects/hack4health/node_modules/express/lib/response.js:164:12)位於res.render.done(/Users/keegan/WebstormProjects/hack4health/node_modules/express/lib/response.js:956:10 )在/Users/keegan/WebstormProjects/hack4health/node_modules/hbs/lib/hbs.js:93:9完成時(/Users/keegan/WebstormProjects/hack4health/node_modules/hbs/lib/async.js:74:20)在/Users/keegan/WebstormProjects/hack4health/node_modules/hbs/lib/hbs.js:88:18在/Users/keegan/WebstormProjects/hack4health/node_modules/hbs/lib/hbs.js:69:11在完成時(/用戶/keegan/WebstormProjects/hack4health/node_modules/hbs/lib/async.js:74:20)位於/Users/keegan/WebstormProjects/hack4health/node_modules/hbs/lib/hbs.js:64:20
在這里,您最多調用三次callback
:
if (name.length < 1) {
…
callback("Please enter a valid name", null);
}
if (story.length < 1) {
…
callback("Please enter a valid story", null);
}
…
callback(null, "finished validating");
這將導致多次寫入響應的回調,在發送第一個正文后嘗試再次寫入標頭時失敗。
您可能要在調用callback
后return
,或者您只想在出現累積errors
僅調用一次。
事實證明,這是由於從Firebase檢索更改時的數據引起的,而不是僅在加載后檢索數據。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.