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环境,隐藏把中间件和接口转发写在这里解决了问题。