A tool for locally testing now lambdas.
Install the tool via
> npm install -g now-lambda-runner
Let's say that we have the following now.json file:
{
"version": 2,
"builds": [
{ "src": "static/assets/**/*.*", "use": "@now/static" },
{ "src": "static/assets/*.*", "use": "@now/static" },
{ "src": "static/*.*", "use": "@now/static" },
{ "src": "api/*.js", "use": "@now/node" },
{ "src": "*.js", "use": "@now/node" },
{ "src": "*.html", "use": "@now/static" }
],
"routes": [
{ "src": "/api/login", "dest": "/api/login.js" },
{ "src": "/api/demo", "dest": "/api/demo.js" },
{ "src": "/static/assets/(.*)", "dest": "/static/assets/$1"},
{ "src": "/static/(.*)", "dest": "/static/$1"},
{ "src": "/e/resources/(?<resource>[^/]*)", "dest": "/static/resources/$resource"},
{ "src": "/e/(.*)?", "dest": "/editor.js?id=$1"},
{ "src": "/docs", "dest": "/docs.html"},
{ "src": "/(.*)", "dest": "/index.html"}
]
}We have to go to the folder containing that now.json file and run
> now-lambda
The result is as follows:
-----------------------------------
Routes:
http://localhost:8004/api/login
http://localhost:8004/api/demo
http://localhost:8004/static/assets/(.*)
http://localhost:8004/static/(.*)
http://localhost:8004/e/resources/(?<resource>[^/]*)
http://localhost:8004/e/(.*)?
http://localhost:8004/docs
http://localhost:8004/(.*)
-----------------------------------
And if we run the following curl request:
curl -i http://localhost:8004/e/foobar
we get editor.js lambda executed. The server reports:
=> /e/foobar === /e/(.*)?
@now/node("/editor.js?id=foobar")
Here's is a list of the things that happen when now-lambda process your now.json file:
- It spins up an expressjs server locally on your machine
- It starts reading the
routesfield in thenow.jsonfile and defines route handlers for each of the routes. - When a route matches it reads the
buildsfield to figure out if it has to server statically the file or it must run the lambda. - The module only understands
@now/staticand@now/node. If there is another builder used the file is considered a static resource and it gets served directly.
now-lambda does not:
- Use the real now builders
- Does not connect to now's servers
now-lambdais a very light abstraction on top of Express. It is possible that some of the route matching works in a different way.now-lambdasends Express'srequestandresponseobjects. In reality when you deploy your app those objects are provided by Node's http module. For examplereq.sendwill not work when you deploy to Zeit because.sendis not a method of http.
--config- path tonow.jsonfile--port- by default the local server listens on port 8004. You can change it via this argument.