nodejs - 在其他请求后无法响应[重复]

Posted

技术标签:

【中文标题】nodejs - 在其他请求后无法响应[重复]【英文标题】:nodejs - can't respond after other request [duplicate] 【发布时间】:2018-05-10 22:19:05 【问题描述】:

我需要在向 API 发出请求后发送响应,但这不起作用:

    app.post('/auth/login', (req, res, next) => 
    if (req.body.login && req.body.password) 

        var options =  method: 'POST',
        url: 'https://auth.etna-alternance.net/login',
        resolveWithFullResponse: true,
        headers:
        'cache-control': 'no-cache',
        'content-type': 'multipart/form-data;' ,
        formData:  login: req.body.login, password: req.body.password  ;
        request(options)
        .then(function (response) 
            console.log(response.body);
            var rawcookies = response.headers['set-cookie'];
            console.log(rawcookies);
            res.sendStatus(200);
        )
        .catch(function (err) 
             res.sendStatus(300);
        );

     else 
    //  res.sendStatus(400);
    
    return next();

);

我的错误:

Unhandled rejection Error: Can't set headers after they are sent.
at validateHeader (_http_outgoing.js:494:11)
at ServerResponse.setHeader (_http_outgoing.js:501:3)
at ServerResponse.header (/Users/nathan/API-Poulette/node_modules/express/lib/response.js:767:10)
at ServerResponse.contentType (/Users/nathan/API-Poulette/node_modules/express/lib/response.js:595:15)
at ServerResponse.sendStatus (/Users/nathan/API-Poulette/node_modules/express/lib/response.js:357:8)
at /Users/nathan/API-Poulette/src/auth.js:41:16
at tryCatcher (/Users/nathan/API-Poulette/node_modules/bluebird/js/release/util.js:16:23)
at Promise._settlePromiseFromHandler (/Users/nathan/API-Poulette/node_modules/bluebird/js/release/promise.js:512:31)
at Promise._settlePromise (/Users/nathan/API-Poulette/node_modules/bluebird/js/release/promise.js:569:18)
at Promise._settlePromise0 (/Users/nathan/API-Poulette/node_modules/bluebird/js/release/promise.js:614:10)
at Promise._settlePromises (/Users/nathan/API-Poulette/node_modules/bluebird/js/release/promise.js:689:18)
at Async._drainQueue (/Users/nathan/API-Poulette/node_modules/bluebird/js/release/async.js:133:16)
at Async._drainQueues (/Users/nathan/API-Poulette/node_modules/bluebird/js/release/async.js:143:10)
at Immediate.Async.drainQueues (/Users/nathan/API-Poulette/node_modules/bluebird/js/release/async.js:17:14)
at runCallback (timers.js:789:20)
at tryOnImmediate (timers.js:751:5)
at processImmediate [as _immediateCallback] (timers.js:722:5)

我使用request-promise,我真的需要等待并在我自己的 API 上发送 API 响应

谢谢你的帮助

【问题讨论】:

基本上意味着你已经处于Body或者Finished状态,但是一些函数试图设置一个header或者statusCode。因为您已经在代码的其他地方这样做了 这可能会有所帮助:***.com/questions/7042340/… 是的,但我之前不打电话给 res 已经读过,但我不使用 res.send 或第一个之前的任何东西 简单地说-是的。 res.sendStatus 多次出现在您的代码中!!你都尝试了些什么?尝试调试,然后可能会发布更多代码。因为没有更多细节,所以有几个类似的问题,所以看看他们 【参考方案1】:

您正在异步处理程序中调用res.sendStatus(200)。你也打电话给next()。结果是在您的处理程序返回之前调用了next()。其效果是,这条路由之后链中的任何中间件(可能只是您的错误处理程序)在request(options).then() 返回之前响应请求。当您收到request() 的回复时,您已经发送了标头。快速的答案是摆脱next(),因为在此之后不应该有任何中间件。您需要响应请求调用next(),但不能同时响应。

【讨论】:

【参考方案2】:

你在 if/else 范围之外调用 next。

请求是异步的,所以当你调用它时,它会启动请求,然后传递给下一个操作,即 next(),直到它得到响应。

【讨论】:

谢谢!真的很被动=)

以上是关于nodejs - 在其他请求后无法响应[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Nodejs(express)正在运行但请求不起作用

Angular和NodeJS阻止了跨域请求[重复]

错误:无法访问属性 href [重复]

Charles——charles 工具栏Tools总结——批量重复请求/重复发包工具/repeat——Advanced Repeat就是重复发包多次

无法从 Flutter Web 上的 localhost API(node js express)获取 http 请求的响应 [重复]

使用 Jquery 从 REST API nodeJS 获取数据 [重复]