为什么NextJS中的此功能在本地工作,而在AWS Lambda中部署却不起作用?

时间:2019-09-14 19:24:16

标签: amazon-web-services aws-lambda next.js serverless-framework aws-serverless

我对此进行了大量测试和研究,但我根本无法弄清楚。我有一个功能,可以在本地运行时完美运行(没有错误),但是当部署为AWS lambda时会失败。

我创建了一个简单的示例来重新创建它:

URL LOCAL (本地URL):http://localhost:3000/flagTest/visible(正常运行✅)

以LAMBDA形式部署的URL https://www.publicfaq.com/flagTest/visible(“切换”按钮不起作用❌)

文件:/ pages / flagTest / [tid] .js(在准系统NextJS安装上)

import React from 'react'


class FlagTest extends React.Component {
  static async getInitialProps({ query }) {

    return { visible: query.tid }

  }

  constructor(){
    super();

    this.state = {
      showFlag:false,
    }

  }

  componentWillMount(){
    this.setState({ showFlag: this.props.visible === 'visible'  });
  }

  handleToggle =()=> {

    this.setState({
      showFlag:!this.state.showFlag
    });
  }

  render() {

    return (
      <div>
        <h1>Flag: {this.state.showFlag ? '?' : ''} </h1>

        <button className='list_toggle' onClick={this.handleToggle}>
          {this.state.showFlag ? 'Hide Flag': 'Show Flag'}
        </button>

        <hr/>

        Props:
        <pre>
          {JSON.stringify(this.props, null, 2)}
        </pre>
        State:
        <pre>
          {JSON.stringify(this.state, null, 2)}
        </pre>

      </div>
    );

  }
}

export default FlagTest

注意:我确实需要使用getInitialProps,因为我打算在更复杂的情况下使用它(API通过id获取),此处未包括它,因为与该问题没有直接关系。

这是我的无服务器YML

service: A123-serverless

provider:
  name: aws
  runtime: nodejs8.10
  stage: ${self:custom.secrets.NODE_ENV}
  region: us-west-2
  environment:
    NODE_ENV: ${self:custom.secrets.NODE_ENV}

functions:
  server:
    handler: index.server
    events:
      - http: ANY /
      - http: ANY /{proxy+}

plugins:
  - serverless-apigw-binary
  - serverless-domain-manager

custom:
  secrets: ${file(secrets.json)}
  apigwBinary:
    types:
      - '*/*'
  customDomain:
    domainName: ${self:custom.secrets.DOMAIN}
    basePath: ''
    stage: ${self:custom.secrets.NODE_ENV}
    createRoute53Record: true
    endpointType: 'regional'

谢谢!

1 个答案:

答案 0 :(得分:0)

我找到了问题的答案,将其张贴在这里,希望可以帮助遇到相同问题的人:

问题是我正在使用“查询”提取“ id”,它在本地运行良好,但是在服务器端使用Express时,您需要将其作为这样的参数传递:


const rp = require('request-promise');
const url = 'https://en.wikipedia.org/wiki/List_of_Presidents_of_the_United_States';

rp(url)
  .then(function(html){
    //success!
    console.log(html);
  })
  .catch(function(err){
    //handle error
  });

然后在React组件上,您可以捕获它并以server.get("/q/:id", (req, res) => { return app.render(req, res, "/q/_tid", { id: req.params.id }); }); 的形式使用它的getInitial道具

req.params.id