如果要將前端的請求中轉到其他網站,并將其返回的數(shù)據(jù)返回給前端咧欣,可以采用如下代碼:
router.all('/*', function (req, res, next) {
let jar = request.jar();
// 以下三步可對不同的 cookie 循環(huán)調用
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 文檔 發(fā)現(xiàn):
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 那三步