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 - 在其他请求后无法响应[重复]的主要内容,如果未能解决你的问题,请参考以下文章
Charles——charles 工具栏Tools总结——批量重复请求/重复发包工具/repeat——Advanced Repeat就是重复发包多次
无法从 Flutter Web 上的 localhost API(node js express)获取 http 请求的响应 [重复]