【问题标题】:Webpack 4 + Jest + Babel 7 (+AWS Lambda): tests pass locally, error when deployed to AWS LambdaWebpack 4 + Jest + Babel 7 (+AWS Lambda):测试在本地通过,部署到 AWS Lambda 时出错
【发布时间】:2018-11-22 02:19:43
【问题描述】:

升级到 Webpack 4 + Jest 23 + Babel 7 并遇到了一些问题。

仅在部署到 AWS Lambda 时出错

{
  "errorMessage": "Handler 'handler' missing on module 'index'"
}

Jest 测试在本地通过。假设 Jest 构建的代码与 npm run build 所做的不同,这就是原因。从import 语句切换到require() 可修复错误消息。所以大概这是一个构建配置问题,需要另一双眼睛。

如果您安装了 SAM Local,可以使用以下命令在本地重现此内容:

git clone https://git@github.com/buildbreakdo/lambda-starter
cd lambda-starter
npm install
npm start 
/usr/bin/open -a "/Applications/Google Chrome.app" 'http://127.0.0.1:5000/'

感谢您的帮助。

处理程序设置为:

package.json

{
  "name": "aws-api-lambda",
  "version": "1.0.0",
  "description": "Minimalist AWS API Gateway and AWS Lambda starter kit",
  "main": "build/index.js",
  "scripts": {
    "build": "NODE_ENV=production webpack --display-error-details --display-modules",
    "watch": "webpack --watch",
    "test": "jest --config ./jest.config.js",
    "test:watch": "jest --watch --config ./jest.config.js",
    "start": "sam local start-api --port 5000",
    "dist": "rm -f dist.zip && zip -jq dist.zip build/index.js",
    "update:dev": "aws lambda update-function-code --function-name DevExample --zip-file fileb://dist.zip --publish",
    "update:prod": "aws lambda update-function-code --function-name ProdExample --zip-file fileb://dist.zip --publish",
    "deploy:dev": "npm run build && npm run test && npm run dist && npm run update:dev",
    "deploy:prod": "npm run build && CI=true npm run test && npm run dist && npm run update:prod"
  },
  "repository": {
    "type": "git",
    "url": "git+https://github.com/buildbreakdo/aws-api-lambda.git"
  },
  "keywords": [
    "starter",
    "starter-kit",
    "aws-api-gateway",
    "aws-lambda"
  ],
  "author": "Your Name Here",
  "bugs": {
    "url": "https://github.com/buildbreakdo/aws-api-lambda/issues"
  },
  "homepage": "https://github.com/buildbreakdo/aws-api-lambda#readme",
  "devDependencies": {
    "@babel/core": "^7.1.6",
    "@babel/preset-env": "^7.1.6",
    "babel-core": "^7.0.0-bridge.0",
    "babel-loader": "^8.0.4",
    "jest": "^23.6.0",
    "webpack": "^4.20.2",
    "webpack-cli": "^3.1.2"
  },
  "dependencies": {
    "cross-fetch": "^2.2.3"
  }
}

.babelrc

{
  "presets": [
    [
      "@babel/preset-env",
      {
        "targets": {
          "node": "8.10"
        }
      }
    ]
  ]
}

webpack.config.js

const path = require('path');
const webpack = require('webpack');

module.exports = {
  optimization: {
    minimize: false
  },
  target: 'node',
  mode: process.env.NODE_ENV === 'production' ? 'production' : 'development',
  entry: [
    path.join(__dirname, 'src/index.js')
  ],
  output: {
    path: path.resolve(__dirname, 'build'),
    filename: 'index.js',
    libraryTarget: 'commonjs2'
  },
  plugins: [
    new webpack.IgnorePlugin(/^pg-native$/),
    new webpack.DefinePlugin({
      'process.env.BROWSER': false,
      __DEV__: process.env.NODE_ENV !== 'production',
    }),
  ],
  module: {
    rules: [
      {
        test: /\.(mjs|js|jsx)$/,
        exclude: /node_modules/,
        use: ['babel-loader']
      }
    ]
  }
};

src/index.js

import fetch from 'cross-fetch';

exports.handler = async (event, context, callback) => {
  const request = fetch('https://google.com', {
    method: 'HEAD'
  });

  let data;
  try {
    const response = await request;

    data = {
      url: response.url,
      status: response.status,
      statusText: response.statusText
    };
  } catch (e) {
    console.log(e);
  }

  return callback(null, {
    statusCode: 200,
    header: {
      'Content-Type': 'application/json'
    },
    body: JSON.stringify(data)
  });
}

build/index.js

https://github.com/buildbreakdo/lambda-starter/blob/master/build/index.js

存储库: https://github.com/buildbreakdo/lambda-starter

【问题讨论】:

    标签: amazon-web-services webpack jestjs babeljs


    【解决方案1】:

    终于有这个工作了。 Babel 7 + Jest 23.6.0 + Webpack 4 + AWS Lambda。今天也发生了 AWS Lambda 中断,所以我什至不确定上面的内容之间是否存在差异(太累了,无法检查!)但这有效。在这里回购:https://github.com/buildbreakdo/lambda-starter

    .babelrc

    {
      "presets": [
        [
          "@babel/preset-env",
          {
            "targets": {
              "node": "8.10"
            }
          }
        ]
      ]
    }
    

    package.json

    {
      "name": "lambda-starter",
      "version": "1.0.0",
      "description": "Minimalist AWS API Gateway and AWS Lambda starter kit",
      "main": "build/index.js",
      "scripts": {
        "build": "NODE_ENV=production webpack --display-error-details --display-modules",
        "watch": "webpack --watch",
        "test": "jest --config ./jest.config.js",
        "test:watch": "jest --watch --config ./jest.config.js",
        "start": "sam local start-api --port 5000",
        "dist": "rm -f dist.zip && zip -jq dist.zip build/index.js",
        "update:dev": "aws lambda update-function-code --function-name DevExample --zip-file fileb://dist.zip --publish",
        "update:prod": "aws lambda update-function-code --function-name ProdExample --zip-file fileb://dist.zip --publish",
        "deploy:dev": "npm run build && npm run test && npm run dist && npm run update:dev",
        "deploy:prod": "npm run build && CI=true npm run test && npm run dist && npm run update:prod"
      },
      "repository": {
        "type": "git",
        "url": "git+https://github.com/buildbreakdo/lambda-starter.git"
      },
      "keywords": [
        "starter",
        "starter-kit",
        "aws-api-gateway",
        "aws-lambda"
      ],
      "author": "Your Name Here",
      "bugs": {
        "url": "https://github.com/buildbreakdo/lambda-starter/issues"
      },
      "homepage": "https://github.com/buildbreakdo/lambda-starter#readme",
      "devDependencies": {
        "@babel/core": "^7.1.6",
        "@babel/preset-env": "^7.1.6",
        "babel-core": "^7.0.0-bridge.0",
        "babel-jest": "^23.6.0",
        "babel-loader": "^7.1.4",
        "jest": "^23.6.0",
        "jest-cli": "^23.6.0",
        "webpack": "^4.8.1",
        "webpack-cli": "^2.0.11"
      },
      "dependencies": {
        "node-fetch": "^2.3.0"
      }
    }
    

    webpack.config.js

    const path = require('path');
    const webpack = require('webpack');
    
    module.exports = {
      target: 'node',
      mode: process.env.NODE_ENV === 'production' ? 'production' : 'development',
      entry: [ './src/index.js' ],
      output: {
        path: path.resolve(__dirname, 'build'),
        filename: 'index.js',
        library: 'index',
        libraryTarget: 'commonjs2'
      },
      plugins: [
        new webpack.IgnorePlugin(/^pg-native$/),
        new webpack.DefinePlugin({
          'process.env.BROWSER': false,
          __DEV__: process.env.NODE_ENV !== 'production',
        }),
      ],
      module: {
        rules: [
          {
            test: /\.(mjs|js|jsx)$/,
            exclude: /node_modules/,
            loader: 'babel-loader'
          }
        ],
      }
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-05
      • 2017-06-19
      • 2016-09-20
      • 2016-08-09
      • 2018-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多