Express Axios获取本地工作但在无服务器上超时的请求
我正试图抓取一些网站,但出于某种原因,它可以在本地(localhost)与express一起工作,但在我将其部署到lambda时就不行了。尝试使用ff serverless http和aws serverless express以及serverless express插件。还尝试在axios和superagent之间切换 路由工作正常,经过数小时的调查,我已经将问题缩小到fetch/axios位。当我没有向axios/superagent/etc添加超时时,应用程序只会保持运行并以15/30秒的速度超时,以设置的时间为准,并得到错误50*Express Axios获取本地工作但在无服务器上超时的请求,express,http,web-scraping,aws-lambda,serverless,Express,Http,Web Scraping,Aws Lambda,Serverless,我正试图抓取一些网站,但出于某种原因,它可以在本地(localhost)与express一起工作,但在我将其部署到lambda时就不行了。尝试使用ff serverless http和aws serverless express以及serverless express插件。还尝试在axios和superagent之间切换 路由工作正常,经过数小时的调查,我已经将问题缩小到fetch/axios位。当我没有向axios/superagent/etc添加超时时,应用程序只会保持运行并以15/30秒的
service: scrape
provider:
name: aws
runtime: nodejs10.x
stage: dev
region: us-east-2
memorySize: 128
timeout: 15
plugins:
- serverless-plugin-typescript
- serverless-express
functions:
app:
handler: src/server.handler
events:
- http:
path: /
method: ANY
cors: true
- http:
path: /{proxy+}
method: ANY
cors: true
protectedasynchfetchhtml(uri:string):承诺{
const htmlElement=await Axios.get(uri,{timeout:5000});
如果(htmlElement.status==200){
const$=Cheerio.load(htmlElement&&htmlElement.data | |“”);
$('script').remove();
返回美元;
}
返回null;
}
据我所知,axios的默认超时是不确定的。记住,API网关有29秒超时的硬限制
我最近也遇到了同样的问题,有时超时是因为冷启动。因此,我基本上必须为前端react应用程序中的api调用添加重试逻辑。是的,然后我为axios添加了5-10秒的超时。这就是我发现axios/request是问题的原因。考虑到本地测试时请求返回正确的响应,整个操作只需要0.5秒,这很奇怪,因为您有很多lambda,如果你有很多Lambda,网络延迟可能会很高。为了解决冷启动问题,我不得不添加一个重试逻辑,从我的前端尝试调用api 3次。我不认为这是一个冷启动问题,对不起,忘了提一下,它在其他网站上工作,只是在某个网站上不工作,我目前正在调查它是否与头有关,或者,如果他们禁止aws lambda ip或其他对我来说是冷启动,因为当天的第一个订单未能执行。重试逻辑也很好。在本地运行api调用需要多长时间?另外,您是否尝试过使用
serverless offline
插件在本地运行?虽然这应该与无服务器框架或express完全无关…但从使用它的Postman测试中,您是否知道问题出在哪里?现在遇到了类似的事情
protected async fetchHtml(uri: string): Promise<CheerioStatic | null> {
const htmlElement = await Axios.get(uri, { timeout: 5000 });
if(htmlElement.status === 200) {
const $ = Cheerio.load(htmlElement && htmlElement.data || '');
$('script').remove();
return $;
}
return null;
}