当我尝试从API服务器向请求者发送响应时遇到了问题(在我的例子中是另一个后端)。它处理msauth登录。第一个响应是登录的url,第二个响应是使用该url完成登录的用户。
这是处理登录请求的控制器
oauth.controller.ts
public msalLogin = async (req: Request, res: Response, next: NextFunction): Promise<void> => {
try {
// create a new event emitter instance for this session
const identifier: string = req.sessionID;
const oAuthUrl: string = await this.oAuthService.msalLogin(identifier);
const acceptStreamHeader = req.get('X-Accept-Response-Stream');
if (acceptStreamHeader !== 'true') {
// Return a 400 Bad Request response if X-Accept-Response-Stream header is not set
res.status(400).send('X-Accept-Response-Stream header is required for this request \n Please use a stream to handle this request');
}
// Set the Transfer-Encoding header to 'chunked'
res.setHeader('Transfer-Encoding', 'chunked');
// res.set('Transfer-Encoding', 'chunked');
res.set('Content-Type', 'application/octet-stream');
// Set a custom header to indicate that the client wants to receive the response as a stream
res.set('X-Accept-Response-Stream', 'true');
// First, send a link in the response
res.write(JSON.stringify({ loginUrl: oAuthUrl }));
const handleLoginFinishEvent = (foundUser: AuthenticationResult) => {
res.write(JSON.stringify(foundUser));
res.end();
}
const eventName = identifier+'-loginFinished';
this.eventEmitter.once(eventName, handleLoginFinishEvent);
//nach 5 minuten event entfernen!
setTimeout(() => {
this.eventEmitter.removeListener(eventName, handleLoginFinishEvent);
res.status(705);
res.write(JSON.stringify({error: "Login has been aborted after being idle for 5 minutes"}))
res.end();
}, 1000 * 60 * 5)
} catch (error) {
next(error);
}
};
是的,我的其他路由都在nginx代理后面工作...除了这个
它在本地主机和开发环境下都能很好的工作,但是当我把它放在我们的nginx反向代理后面时,它就停止工作了。
当它在反向代理后面时,它似乎没有将其作为流来处理,而是等待响应完全完成(它从来没有这样做过,因为请求者从来没有获得登录链接)
我试着在谷歌上搜索这个问题,但是没有发现和我的问题相似的东西......有什么方法可以解决这个问题吗?我可以告诉nginx反向代理也使用流吗?
**EDIT:**在localhost -〉上使用失眠(REST客户端)调用API,然后它将永远运行...但如果我在prod域中调用if,它将向我抛出此错误:“错误:HTTP/2帧层中的流错误”
提前致谢!
1条答案
按热度按时间a0x5cqrl1#
所以我自己修好了问题是反向代理尝试将我的API响应转换为HTTP/2,但不知何故,将流转换为HTTP/2无法正常工作。因此,我从应用程序后端使用一个特殊的包来请求它,默认情况下,该应用程序后端以http 2的形式请求它。npm包称为https://www.npmjs.com/package/fetch-h2