Express Axios获取本地工作但在无服务器上超时的请求

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秒的

我正试图抓取一些网站,但出于某种原因,它可以在本地(localhost)与express一起工作,但在我将其部署到lambda时就不行了。尝试使用ff serverless http和aws serverless express以及serverless express插件。还尝试在axios和superagent之间切换

路由工作正常,经过数小时的调查,我已经将问题缩小到fetch/axios位。当我没有向axios/superagent/etc添加超时时,应用程序只会保持运行并以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

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;
    }