Webpack 4 + Jest + Babel 7 (+ AWS Lambda): тесты проходят локально, ошибка при развертывании в AWS Lambda - PullRequest
0 голосов
/ 22 ноября 2018

Обновление до 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/'

Спасибо за помощь.

Обработчик установлен на:

enter image description here

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

1 Ответ

0 голосов
/ 22 ноября 2018

Наконец-то все заработало.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'
      }
    ],
  }
};
...