Skip to content

sls invoke local won't work #1481

@jrean

Description

@jrean

Hey, I'm trying to understand the following behaviour. Here are the steps to reproduce:

// node v14.21.3
// npm 6.14.18

npm install serverless-webpack --save-dev

I update the package.json to include serverless version 3. Here is the default package.json:

{
  "name": "serverless-3",
  "version": "1.0.0",
  "description": "Serverless google-nodejs-typescript template",
  "main": "serverless.ts",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "deploy": "sls deploy",
    "compile": "tsc"
  },
  "engines": {
    "node": ">=14.15.0"
  },
  "devDependencies": {
    "@serverless/typescript": "^3.30.1",
    "@types/express": "^4.17.11",
    "@types/node": "^20.2.5",
    "express": "^4.18.2",
    "serverless": "^3.31.0",
    "serverless-google-cloudfunctions": "^4.6.0",
    "serverless-webpack": "^5.11.0",
    "ts-loader": "^9.4.3",
    "ts-node": "^10.9.1",
    "tsconfig-paths": "^4.2.0",
    "tsconfig-paths-webpack-plugin": "^4.0.1",
    "typescript": "^5.0.4",
    "webpack": "^5.84.1",
    "webpack-node-externals": "^3.0.0"
  },
  "author": "Corentin Doué",
  "license": "MIT"
}

I run the typescript compiler, no warnings / errors. All good. I run the default httpHello function locally with the following command: sls invoke local --function httpHello -p src/tests/mocks/postHelloWorld.json --verbose.
The content of postHelloWorld.json is as follow:

{
  "method": "POST",
  "headers": {
    "content-type": "application/json"
  },
  "body": {
    "message": "Hello World"
  }
}

All good it's very fast:

Running "serverless" from node_modules
Using configuration:
{
  "webpackConfig": "./webpack.config.js",
  "includeModules": true,
  "packager": "npm",
  "packagerOptions": {},
  "keepOutputDirectory": false,
  "concurrency": 4
}
Removing xxx/serverless-3/.webpack
[Webpack] Building with Webpack
...
 2023-05-28 16:33:27: webpack 5.84.1 compiled successfully in 306 ms (9c707081b43153503a0e)

{"severity":"INFO","message":"Hello World"}
{
    "status": 200,
    "headers": {}
}

Now, I update the default http-hello/handler.ts as follow, to have some validation layer:

import type { Request, Response } from './types';
import { body } from 'express-validator';
import { handleWithValidation } from '@libs/http-handler';
import { logger } from '@libs/logs';

export const httpHello = handleWithValidation(
  body('message').isString(),
  async (req: Request, res: Response) => {

    const {
      body: { message },
    } = req

    logger.info({ message })

    res.status(200).send()
  }
)

And the libs/http-handler.ts as follow:

import type { Request , Response, RequestHandler } from 'express';
import { validationResult as defaultValidationResult } from 'express-validator';
import express from 'express';
import { logger } from "@libs/logs";

export const handle = (...handlers: RequestHandler[]): RequestHandler => {
  const httpHandler = express()
  httpHandler.use(express.json())
  httpHandler.use(async (req: Request, res: Response, next): Promise<void> => {
    logger.init(req);

    try {
      next()
    } catch (error) {
      logger.error(error);
      res.status(500).send();
    }
  })

  httpHandler.use(handlers);

  return httpHandler;
};

export const validationResult = defaultValidationResult.withDefaults({
  formatter: error => {
    delete error.msg;
    return error;
  }
})

export const handleValidation: RequestHandler = (req, res, next) => {
  const errors = validationResult(req);

  if (!errors.isEmpty()) {
    return res.status(422).json({
      errors: errors.mapped()
    })
  }

  next()
}

export const handleWithValidation = (...handlers: RequestHandler[]): RequestHandler => {
  handlers.splice(handlers.length - 1, 0, handleValidation);

  return handle(...handlers);
}

Nothing crazy! I install the express-validator package. I run the typescript compiler, no warnings / errors.
I do not change anything from the previous tests.

I run the exact same command: sls invoke local --function httpHello -p src/tests/mocks/postHelloWorld.json --verbose.
But this time webpack stay stuck forever:

...
2023-05-28 16:41:41: webpack 5.84.1 compiled successfully in 329 ms (8958ac2868ea56396deb)
⠏ [Webpack] Building with Webpack ...

And the output of the function never happens.
What am I missing please?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions