【问题标题】:Express js "res.append" Error: Can't set headers after they are sentExpress js“res.append”错误:发送后无法设置标题
【发布时间】:2015-06-16 12:37:17
【问题描述】:

在我的快速项目中,我调用“res.append”在同一个请求中设置多个 cookie。但是我收到了这样的错误“错误:发送后无法设置标头。”。 任何人都可以找出问题并给出解决方案或告诉其他更好的方法吗?

我的代码如下:

var setCookie = function(res, key, value, hrs, callback) {
    if (typeof value === 'number'){value = value.toString(); }
    if (typeof value === 'object'){value = JSON.stringify(value); }
    var c;
    if (hrs === 0) {
        c = cookie.serialize(key, value, {httpOnly: true, path: '/', signed: true});
    }
    else {
        c = cookie.serialize(key, value, {
            maxAge: 3600 * hrs,
            httpOnly: true,
            path: '/',
            signed: true
        });
    }
    res.append('Set-Cookie', c);
    callback(1);
};

var setLoginCookies = function(req, res, uaid, uuid, locale, trusted, callback) {
    //sid
    console.log('setLoginCookies:sid');
    setCookie(res, 'sid', req.sessionID, 168, function () {
        //uuid
        console.log('setLoginCookies:uuid');
        setCookie(res, 'uid', uuid, 168, function () {
            //locale
            console.log('setLoginCookies:locale');
            setCookie(res, 'locale', locale, 0, function () {
                callback(1);
            });
        });
    });
};

错误:

GET / 200 748.366 ms - 5209
setLoginCookies:sid
D:\mongodb\Project\node_modules\connect-mongo\node_modules\mongodb\lib\utils.js:97
    process.nextTick(function() { throw err; });
                                        ^
Error: Can't set headers after they are sent.
    at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:335:11)
    at ServerResponse.header (D:\mongodb\Project\node_modules\express\lib\response.js:700:10)
    at ServerResponse.append (D:\mongodb\Project\node_modules\express\lib\response.js:670:15)
    at setCookie (D:\mongodb\Project\com_modules\ran-doratupaala\app\libs\libCom.js:88:9)
    at Object.setLoginCookies (D:\mongodb\Project\com_modules\ran-doratupaala\app\libs\libCom.js:123:5)
    at D:\mongodb\Project\com_modules\ran-doratupaala\index.js:101:28
    at D:\mongodb\Project\node_modules\express-session\session\store.js:43:5
    at D:\mongodb\Project\node_modules\connect-mongo\lib\connect-mongo.js:437:9
    at handleCallback (D:\mongodb\Project\node_modules\connect-mongo\node_modules\mongodb\lib\utils.js:95:12)
    at D:\mongodb\Project\node_modules\connect-mongo\node_modules\mongodb\lib\collection.js:763:5
    at D:\mongodb\Project\node_modules\connect-mongo\node_modules\mongodb\node_modules\mongodb-core\lib\topologies\server.js:795:13
    at Callbacks.emit (D:\mongodb\Project\node_modules\connect-mongo\node_modules\mongodb\node_modules\mongodb-core\lib\topologies\server.js:94:3)
    at null.messageHandler (D:\mongodb\Project\node_modules\connect-mongo\node_modules\mongodb\node_modules\mongodb-core\lib\topologies\server.js:235:23)
    at Socket.<anonymous> (D:\mongodb\Project\node_modules\connect-mongo\node_modules\mongodb\node_modules\mongodb-core\lib\connection\connection.js:259:22)
    at Socket.emit (events.js:107:17)
    at readableAddChunk (_stream_readable.js:163:16)
16 Jun 19:58:05 - [nodemon] app crashed - waiting for file changes before starting...

【问题讨论】:

  • 要准确了解请求到达时发生的情况,我们还需要堆栈跟踪中提到的部分周围的代码:setCookie at com_modules\ran-doratupaala\app\libs\libCom.js:88:9Object.setLoginCookies at com_modules\ran-doratupaala\app\libs\libCom.js:123:5com_modules\ran-doratupaala\index.js:101:28。在您尝试设置标头之前,似乎已经有一些内容发送回客户端

标签: javascript node.js express web-applications


【解决方案1】:

显示你如何调用 setLoginCookies 函数的上下文?

看起来有点像,也许 cookie.serialize 可能是异步的,导致 javascript 在 setLoginCookies 之后继续执行,而不是等待它完成。

另外,为什么不使用链接模式

cookiez(res)
    .set('sid', req.sessionID, 168)
    .set('uid', uuid, 168)
    .set('locale', locale, 0);

【讨论】:

  • 是的,我完全同意这里。在非异步情况下使用回调模式没有意义,并且会使代码看起来比实际更糟糕!
【解决方案2】:

问题是您多次发出 res.append。据我了解,一个响应只能给出一次。

【讨论】:

  • 不,只有res.send 的情况。使用res.append 添加标题信息see the docs
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-28
  • 1970-01-01
  • 2017-03-03
  • 1970-01-01
相关资源
最近更新 更多