代码之家  ›  专栏  ›  技术社区  ›  Joshua Robinson

Webpack 4+Jest+Babel 7(+AWS Lambda):测试在本地通过,部署到awslambda时出错

  •  0
  • Joshua Robinson  · 技术社区  · 6 年前

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

    错误 只有

    {
      "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/'
    

    处理程序设置为:

    enter image description here

    {
      "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"
      }
    }
    

    巴贝尔

    {
      "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']
          }
        ]
      }
    };
    

    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

    1 回复  |  直到 6 年前
        1
  •  1
  •   Joshua Robinson    6 年前

    终于有这个工作了。巴贝尔7+Jest 23.6.0+Webpack 4+AWS Lambda。今天也有一个AWS Lambda中断,所以我甚至不确定上面的内容是否有区别(太累了,无法检查!)但这行得通。此处回购: https://github.com/buildbreakdo/lambda-starter

    巴贝尔

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

    包.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"
      }
    }
    

    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'
          }
        ],
      }
    };