nginx Express JS流在反向代理后不工作

v8wbuo2f  于 2023-03-01  发布在  Nginx
关注(0)|答案(1)|浏览(159)

当我尝试从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帧层中的流错误”

提前致谢!

a0x5cqrl

a0x5cqrl1#

所以我自己修好了问题是反向代理尝试将我的API响应转换为HTTP/2,但不知何故,将流转换为HTTP/2无法正常工作。因此,我从应用程序后端使用一个特殊的包来请求它,默认情况下,该应用程序后端以http 2的形式请求它。npm包称为https://www.npmjs.com/package/fetch-h2

相关问题