我正在尝试抓取一些网站,但由于某种原因,它在本地(本地主机(使用 express,但当我将其部署到 lambda 时则不行。尝试使用 ff serverless-http 和 aws-serverless-express 和 serverless-express 插件。还尝试在公理和超级代理之间切换。
路由工作正常,经过数小时的调查,我将问题缩小到获取/axios 位。当我不向 axios/superagent/等添加超时时,应用程序只会继续运行并在 15/30 秒超时,以设置为准并得到错误 50*。
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
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;
}
据我所知,axios 的默认超时是无限期的。请记住,API 网关有 29 秒超时的硬限制。
我最近遇到了同样的问题,有时超时是由于冷启动。所以我基本上不得不在我的前端反应应用程序中为 api 调用添加一个重试逻辑。