帮我解决问题,发红包~ 偶尔提示错误 Cannot set headers after they are sent to the client ?
发布于 3 天前 作者 xulayen 449 次浏览 最后一次编辑是 2 天前 来自 问答

You have triggered an unhandledRejection, you may have forgotten to catch a Promise rejection: Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client

const rp=require('request-promise');


rp(...).then(...).catch(...).finally(function () {
        // This is called after the request finishes either successful or not successful.
        return res.send(_objResult);//这句偶尔会报错
});

上面那段是一个公共方法,我封装成了一个ApiCall,大部分都会走这个函数,有没可能是并发导致一个请求还未发送出去另一个请求又进来了?请大神帮忙看下~

QQ 617284237

image.png

23 回复

有多次调用res.send之类的方法就会出现这种

@zengming00 那意思是报错的这个地方之前还调用了一次send之类的方法么。但是并没有额

@xulayen 仔细查查,肯定有,或者不是在之前而是在之后

@zengming00

JSBINhttps://jsbin.com/xunututehi/edit?js

return res.redirect(_forword); //这句话 偶尔报错,但是之前之后也没有 res.send之类的操作

你的catch里面有没有返回呢? 如果有错误了,最后还会走finally

@shadow88sky image.png

图上是源码 705行。

这个,在生产环境下有时候也会出现 这个错


Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
    at ServerResponse.setHeader (_http_outgoing.js:470:11)
    at ServerResponse.header (/mnt/www/pgyer/nodejs-middle/node_modules/express/lib/response.js:771:10)
    at ServerResponse.append (/mnt/www/pgyer/nodejs-middle/node_modules/express/lib/response.js:732:15)
    at ServerResponse.res.cookie (/mnt/www/pgyer/nodejs-middle/node_modules/express/lib/response.js:857:8)
    at Request.cookie [as _callback] (/mnt/www/pgyer/nodejs-middle/server/api/admin/account/index.js:705:17)
    at Request.self.callback (/mnt/www/pgyer/nodejs-middle/node_modules/request/request.js:185:22)
    at Request.emit (events.js:198:13)
    at Request.<anonymous> (/mnt/www/pgyer/nodejs-middle/node_modules/request/request.js:1161:10)
    at Request.emit (events.js:198:13)
    at IncomingMessage.<anonymous> (/mnt/www/pgyer/nodejs-middle/node_modules/request/request.js:1083:12)
    at Object.onceWrapper (events.js:286:20)
    at IncomingMessage.emit (events.js:203:15)
    at endReadableNT (_stream_readable.js:1129:12)
    at process._tickCallback (internal/process/next_tick.js:63:19)

请确保这些设置在 send之前 只要发送 send执行过一次,再涉及到 set cookie、set header这种设置 http head 部分的都会报错

send只能发送一次吧,write可以多次

@zhhb 是在send之前,现在又出现了一次

@zhhb

image.png 这句话之前没有任何 set cookie、set header 的操作了

@zhhb 这里用了一个异步promise ,报错好像是报这个promie有问题。


router.get('/:customerid/:accode/:timestamp/:sign', async function (req, res, next) {

                var reply = await client.get(`${key}`);
            ...
                    return res.redirect(reply);
     ...

});


下面是promise功能代码,看下是哪里没有捕获promise异常?



const config = require('../../config/index');
var redis = require("redis"),
    client = redis.createClient(config.redis);


client.on("error", function (err) {
    console.log("Error " + err);
});

client.on('ready', function (res) {
    console.log('redis is ready,Go!');
});

function clientCache() { }

let text = async (key) => {
    let doc = await new Promise((resolve) => {
        // setTimeout(() => {
        //     Promise.reject(new Error('unhandledrejection'))
        // }, 0);
        client.get(key, function (err, res) {
            return resolve(res);
        });
    }).catch((e) => {
        console.log(e)
    });
    return JSON.parse(doc);

};

clientCache.set = function (key, value) {
    value = JSON.stringify(value);
    return client.set(key, value, function (err) {
        if (err) {
            console.error(err);
        }
    });
};

clientCache.get = async (key) => {
    return await text(key);
};

clientCache.expire = function (key, time) {
    return client.expire(key, time);
};


module.exports = exports = clientCache;

回到顶部