Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 在Lambda函数中使用axios时,根据以前的请求设置cookie_Node.js_Aws Lambda_Axios - Fatal编程技术网

Node.js 在Lambda函数中使用axios时,根据以前的请求设置cookie

Node.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调用中使用它。

我在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 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上跑步。没有涉及服务器。