Node Express 发送后无法设置 headers
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 中遇到的错误。
Error: /Users/keegan/WebstormProjects/hack4health/views/error.hbs:
Can't set headers after they are sent.
at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:356:11)
at ServerResponse.header (/Users/keegan/WebstormProjects/hack4health/node_modules/express/lib/response.js:719:10)
at ServerResponse.send (/Users/keegan/WebstormProjects/hack4health/node_modules/express/lib/response.js:164:12)
at res.render.done (/Users/keegan/WebstormProjects/hack4health/node_modules/express/lib/response.js:956:10)
at /Users/keegan/WebstormProjects/hack4health/node_modules/hbs/lib/hbs.js:93:9
at done (/Users/keegan/WebstormProjects/hack4health/node_modules/hbs/lib/async.js:74:20)
at /Users/keegan/WebstormProjects/hack4health/node_modules/hbs/lib/hbs.js:88:18
at /Users/keegan/WebstormProjects/hack4health/node_modules/hbs/lib/hbs.js:69:11
at done (/Users/keegan/WebstormProjects/hack4health/node_modules/hbs/lib/async.js:74:20)
at /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");
这将导致多次调用写入响应的回调,在发送第一个 body 后再次尝试写入 headers 时失败。
你要么在调用 callback
之后想要 return
,要么你只想在最后调用它一次,累积的 errors
。
事实证明,这是由于从 Firebase 检索更改数据造成的,而不是仅在加载时检索一次数据。
我知道已经通过多种方式询问过这个问题,但我的问题似乎与已经发布的问题不同。
我正在尝试将数据从表单发送到 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 中遇到的错误。
Error: /Users/keegan/WebstormProjects/hack4health/views/error.hbs: Can't set headers after they are sent. at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:356:11) at ServerResponse.header (/Users/keegan/WebstormProjects/hack4health/node_modules/express/lib/response.js:719:10) at ServerResponse.send (/Users/keegan/WebstormProjects/hack4health/node_modules/express/lib/response.js:164:12) at res.render.done (/Users/keegan/WebstormProjects/hack4health/node_modules/express/lib/response.js:956:10) at /Users/keegan/WebstormProjects/hack4health/node_modules/hbs/lib/hbs.js:93:9 at done (/Users/keegan/WebstormProjects/hack4health/node_modules/hbs/lib/async.js:74:20) at /Users/keegan/WebstormProjects/hack4health/node_modules/hbs/lib/hbs.js:88:18 at /Users/keegan/WebstormProjects/hack4health/node_modules/hbs/lib/hbs.js:69:11 at done (/Users/keegan/WebstormProjects/hack4health/node_modules/hbs/lib/async.js:74:20) at /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");
这将导致多次调用写入响应的回调,在发送第一个 body 后再次尝试写入 headers 时失败。
你要么在调用 callback
之后想要 return
,要么你只想在最后调用它一次,累积的 errors
。
事实证明,这是由于从 Firebase 检索更改数据造成的,而不是仅在加载时检索一次数据。