如果要将前端的请求中转到其他网站,并将其返回的数据返回给前端,可以采用如下代码:
router.all('/*', function (req, res, next) {
let jar = request.jar();
// 以下三步可对不同的 cookie 循环调用
let cookieStr = 'key=' + req.cookies['key'];
let cookie = request.cookie(cookieStr);
jar.setCookie(cookie, config.host + req.url);
const p = request(config.host + req.url, {
method: req.method,
form: _.clone(req.body),
jar: jar
});
req.pipe(p);
p.pipe(res);
p.on('error', handleError(next));
});
其中,处理 cookie 的那一段为简略写法,具体使用方法为:request.cookie('key1=value1')
具体需求中,可以遍历 req.cookies 所有的 cookie,分别将其转化为 'key1=value1' 形式的字符串,然后依次调用 request.cookie 和 jar.setCookie
遇到的问题
post 请求带有 form 的时候会报错:write after end
解决方法
https://github.com/request/request/issues/1664
最后
查阅 request 文档 发现:
form - when passed an object or a querystring, this sets body to a querystring representation of value, and adds Content-type: application/x-www-form-urlencoded header. When passed no options, a FormData instance is returned (and is piped to request). See "Forms" section above.
form: _.clone(req.body) 会变成以 application/x-www-form-urlencoded 方式请求,然后进入 body-parser,所以传输文件和普通字段的情况要分开写(传输文件的代码把这一行删掉)
req.pipe(p, {end: false}) 仍然不能解决问题,加上这个 end 配置的话,连普通 get 请求都会超时,所以还是只能采取把 req.pipe(p) 注释掉的方法
但是对于传输文件,req.pipe(p) 和 req.pipe(p, {end: false}) 都可以,没有的话会一直 pending (待探究)
将 jar 字段设为 true 就会自动在请求中包含 cookie,不用上面处理 cookie 那三步