如何使用 node-fetch 发送 cookie?
How to send cookies with node-fetch?
我有 nodejs 应用程序,它处理用户的请求并接收我想代理到内部 API 服务的 cookie。如何使用 node-fetch 解决这个问题?
请不要提供超级代理。
您应该可以通过在请求的 header 中设置 cookie 来传递它:
const opts = {
headers: {
cookie: 'accessToken=1234abc; userId=1234'
}
};
const result = await fetch(`/some/url`, opts);
为了简单起见,您可以编写一个中间件,它将包含 global.fetch 的 cookie,如下所示。
const realFetch = fetch;
function cookieFetch(fetch, cookie) {
return (url, opts) => {
opts = opts || {};
return fetch(url, Object.assign(opts, {
headers: Object.assign(opts.headers || {}, { cookie })
}));
};
}
function middleware(req, res, next) {
const kuki = req.headers.cookie;
global.fetch = kuki ?
cookieFetch(realFetch, kuki) :
realFetch;
next();
}
module.exports = middleware;
像机器人一样读写 cookie
async function login() {
return fetch('<some_url>/login', {
'headers': {
'accept': '*/*',
'content-type': 'application/x-www-form-urlencoded; charset=UTF-8',
'cookie': '',
},
'body': 'username=foo&password=bar',
'method': 'POST',
});
}
(async() => {
const loginResponse = await login();
const loginCookies = parseCookies(loginResponse);
})();
您可能想要包括:accept-language
、user-agent
、referer
、accept-encoding
等(查看 Chrome DevTools 上的示例请求通过网络选项卡)
出于某种原因,node-fetch 请求生成的 cookie 与新请求不兼容,但我们可以这样解析它们:
function parseCookies(response) {
const raw = response.headers.raw()['set-cookie'];
return raw.map((entry) => {
const parts = entry.split(';');
const cookiePart = parts[0];
return cookiePart;
}).join(';');
}
在您以后的请求中通过相同的方式传递 cookie headers:
return fetch('<some_url>/dashboard', {
'headers': {
'accept': '*/*',
'cookie': parsedCookies,
},
'method': 'GET',
});
我有 nodejs 应用程序,它处理用户的请求并接收我想代理到内部 API 服务的 cookie。如何使用 node-fetch 解决这个问题?
请不要提供超级代理。
您应该可以通过在请求的 header 中设置 cookie 来传递它:
const opts = {
headers: {
cookie: 'accessToken=1234abc; userId=1234'
}
};
const result = await fetch(`/some/url`, opts);
为了简单起见,您可以编写一个中间件,它将包含 global.fetch 的 cookie,如下所示。
const realFetch = fetch;
function cookieFetch(fetch, cookie) {
return (url, opts) => {
opts = opts || {};
return fetch(url, Object.assign(opts, {
headers: Object.assign(opts.headers || {}, { cookie })
}));
};
}
function middleware(req, res, next) {
const kuki = req.headers.cookie;
global.fetch = kuki ?
cookieFetch(realFetch, kuki) :
realFetch;
next();
}
module.exports = middleware;
像机器人一样读写 cookie
async function login() {
return fetch('<some_url>/login', {
'headers': {
'accept': '*/*',
'content-type': 'application/x-www-form-urlencoded; charset=UTF-8',
'cookie': '',
},
'body': 'username=foo&password=bar',
'method': 'POST',
});
}
(async() => {
const loginResponse = await login();
const loginCookies = parseCookies(loginResponse);
})();
您可能想要包括:accept-language
、user-agent
、referer
、accept-encoding
等(查看 Chrome DevTools 上的示例请求通过网络选项卡)
出于某种原因,node-fetch 请求生成的 cookie 与新请求不兼容,但我们可以这样解析它们:
function parseCookies(response) {
const raw = response.headers.raw()['set-cookie'];
return raw.map((entry) => {
const parts = entry.split(';');
const cookiePart = parts[0];
return cookiePart;
}).join(';');
}
在您以后的请求中通过相同的方式传递 cookie headers:
return fetch('<some_url>/dashboard', {
'headers': {
'accept': '*/*',
'cookie': parsedCookies,
},
'method': 'GET',
});