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 检索更改数据造成的,而不是仅在加载时检索一次数据。