nestjs 内post请求被挂起问题踩坑纪实

node项目跳坑与爬坑:

解决调用线上接口时诸多问题

需求描述:需要在 每个业务接口 调用之前调用一个线上用户信息接口(A接口)。于是使用node中间件形式解决此问题,如下:

import { Injectable, NestMiddleware } from '@nestjs/common';
const axios = require("axios")
@Injectable()
export class CondoAuthMiddleware implements NestMiddleware {
  use(req: any, res: any, next: () => void) {
    axios.get(
      `http://******/api/login/info`,
      {headers: { cookie: req.headers.cookie }}
    ).then(v => {
      //todo:设置业务接口请求头
      next()
    }).catch(v => {
      next()
    });
  }
}

阻塞点1.

  • 表现:上层请求为get时一切正常,但是为post时A接口会超时。
  • 起因:A接口需要借助当前环境的cookie获取当前用户信息,但是由于node层无法感知当前浏览器环境(即无法自动获取cookie),于是我把请求头设置为上层接口的header:{headers: { cookie: req.headers }}
  • 分析:post请求的headers中某项会干扰A接口的请求。
  • 解决:刨除header中的不必要项,只传cookie给A接口的header:{headers: { cookie: req.headers.cookie }}。后问题解决。

阻塞点2.

  • 表现:经过接口转发的get请求可以正常发到后端机器,但是post请求无法正常发送。
  • 起因:bodyParser相关原因(还不知道具体的原因)。
  • 分析:nest中默认开启的bodyParser捣的鬼。实测bodyParser+httpProxy一起使用的时候会导致post请求阻塞。所以应该关闭bodyParser。
  • 解决:总体方案是关闭bodyParser。想过直接关闭nest里默认全局开启的bodyParser,但是由于项目里还有其他页面,担心影响它们,所以放弃了全局关闭的方法。后来发现nest项目中只有AppMoudle内的代码是打开bodyParser的,即在main.ts内还不是nest环境,隐藏把中间件和接口转发写在这里解决了问题。
上一篇:react中 数组中对象修改值


下一篇:express中使用ejs注意点