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
routes
field in thenow.json
file and defines route handlers for each of the routes. - When a route matches it reads the
builds
field to figure out if it has to server statically the file or it must run the lambda. - The module only understands
@now/static
and@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-lambda
is a very light abstraction on top of Express. It is possible that some of the route matching works in a different way.now-lambda
sends Express'srequest
andresponse
objects. In reality when you deploy your app those objects are provided by Node's http module. For examplereq.send
will not work when you deploy to Zeit because.send
is not a method of http.
--config
- path tonow.json
file--port
- by default the local server listens on port 8004. You can change it via this argument.