Node.js 在Lambda函数中使用axios时,根据以前的请求设置cookie
我在NodeJs应用程序中使用Axios来执行HTTP请求 我使用post请求登录,该请求不需要在标头中设置cookieNode.js 在Lambda函数中使用axios时,根据以前的请求设置cookie,node.js,aws-lambda,axios,Node.js,Aws Lambda,Axios,我在NodeJs应用程序中使用Axios来执行HTTP请求 我使用post请求登录,该请求不需要在标头中设置cookie const instance = axios.create({ baseURL: 'https://some_url.com' , withCredentials: true}); const response = await instance.post('auth/login', data); 这将在其头中返回一个set cookie,我需要在所有后续API调用中使用它。
const instance = axios.create({ baseURL: 'https://some_url.com' , withCredentials: true});
const response = await instance.post('auth/login', data);
这将在其头中返回一个set cookie
,我需要在所有后续API调用中使用它。这是我尝试过的代码
const getResponse = await instance.get('/getStuff?$top=10', { withCredentials: true });
这总是返回一个“未登录错误”。我没有访问服务器的权限,但我假设这是因为get请求没有在其头中发送cookie
在lambda中运行所有这些,不确定这是否会产生影响
问题:如何从我的第一次
post
请求中获取cookie,并在我的get
请求中使用它?带凭据的选项适用于浏览器版本的axios,并且依赖浏览器来存储当前站点的cookie
因为您在节点中使用它,所以必须自己处理存储
TL;DR
在登录请求之后,将cookie保存到某个地方。在发送其他请求之前,请确保包含该cookie
要读取cookie,请选中response.headers
对象,该对象应该有一个set cookie
头(所有cookie实际上都是-headers带有一点特殊约定,已经演变成某种标准)
要在HTTP请求中包含cookie,请设置cookie
头
一般示例
如果您需要比“保存这一个我知道我会得到的简单cookie”更好的东西,您还可以寻找一些“cookie处理”库
//1。准备好axios实例
函数createAxios(){
const axios=require('axios');
返回axios.create({withCredentials:true});
}
const axiosInstance=createAxios();
// 2. 确保登录后保存cookie。
//我正在使用一个对象,因此对cookie的引用总是相同的。
常数cookieJar={
myCookies:未定义,
};
异步函数登录(){
const response=等待axiosInstance.post('http://localhost:3003/auth', {});
cookieJar.mycokies=response.headers['set-cookie'];
}
// 3. 将保存的cookie添加到请求中。
异步函数请求(){
//阅读cookie并在标题中设置它
const response=等待axiosInstance.get('http://localhost:3003',
{
标题:{
cookie:cookieJar.mycokies,
},
});
console.log(响应状态);
}
登录()
。然后(()=>request());
您还可以使用axios.defaults
在获得cookie后对所有请求强制执行cookie:
异步函数登录(){
const response=等待axios.post('http://localhost:3003/auth', {});
axios.defaults.headers.cookie=response.headers['set-cookie']
}
异步函数请求(){
const response=等待axios.get('http://localhost:3003');
}
只要您能保证在请求
之前调用登录
,您就可以了
您还可以探索其他axios功能,例如。这可能有助于将所有与“axios配置”相关的代码保存在一个位置(而不是在登录
功能中摆弄默认值,或者在登录
和请求
中调整cookie)
兰姆达
AWS Lambda可能会为它收到的每个请求生成一个新实例,因此您可能需要注意一些实例生命周期细节
你的选择是:
什么都不做:您不在乎为每次lambda运行发送“登录请求”。它不会对您的响应时间产生太大影响,而另一个api也不介意您发送多个登录请求。另外,另一个api对您可能同时拥有多个cookie没有问题(例如,如果10个lambda实例同时登录)
lambda实例中的缓存:您有一个lambda实例,每隔一段时间就会被使用一次,但通常在任何时候都不会有多个实例运行。出于性能原因,您只希望缓存cookie。如果多个lambda实例正在运行,它们将各自获得一个cookie。注意另一个api不允许多次登录
如果这是您需要的,请确保将axios配置放入单独的模块中,并导出已配置的实例。它将在一个lambda实例的运行之间缓存。此选项与拦截器的使用非常匹配
const instance=axios.create({…});
instance.interceptors.response.use(()=>{});/*坚持饼干*/
instance.interceptors.request.use(()=>{});/*如果你有曲奇饼,就设置它*/
导出默认实例;
lambda实例之间的缓存:这稍微复杂一些。您将希望在外部缓存cookie。您可以将其存储在数据库中(键值存储、关系型、面向文档-无所谓),也可以尝试使用共享磁盘空间(我相信lambda实例共享一些目录,如/tmp
,但不是100%确定)
您可能必须处理这样的情况,即您的lambda同时被多个请求击中,并且他们都认为自己没有cookie,因此他们都试图同时登录。基本上,常见的分布式系统/缓存问题
您的登录请求成功吗?您的nodejs服务器上是否启用了Cookie?@hoangdv是的,登录成功。@RohitDalal。在一辆Lambda上跑步。没有涉及服务器。