NodeJS
Provides an Elixir API for calling Node.js functions.
Documentation
The docs can be found at https://hexdocs.pm/nodejs.
Prerequisites
- Elixir >= 1.6
- NodeJS >= 10
Installation
def deps do
[
{:nodejs, "~> 0.1.0"}
]
endStarting the service
Add NodeJS to your Supervisor as a child, pointing the required path option at the
directory containing your JavaScript modules.
supervisor(NodeJS, [[path: "/node_app_root", pool_size: 4]])
Calling JavaScript module functions with NodeJS.call(module, args \\ []).
If the module exports a function directly, like this:
module.exports = (x) => xYou can call it like this:
NodeJS.call("echo", ["hello"]) #=> {:ok, "hello"}
There is also a call! form that throws on error instead of returning a tuple:
NodeJS.call!("echo", ["hello"]) #=> "hello"If the module exports an object with named functions like:
exports.add = (a, b) => a + b
exports.sub = (a, b) => a - bYou can call them like this:
NodeJS.call({"math", :add}, [1, 2]) # => {:ok, 3}
NodeJS.call({"math", :sub}, [1, 2]) # => {:ok, -1}There Are Rules & Limitations (Unfortunately)
- Function arguments must be serializable to JSON.
- Return values must be serializable to JSON. (Objects with circular references will definitely fail.)
-
Modules must be requested relative to the
paththat was given to theSupervisor. E.g., for apathof/node_app_rootand a file/node_app_root/foo/index.jsyour module request should be for"foo/index.js"or"foo/index"or"foo". -
To reference
node_modulesdependecies, do one of the following:- Make local modules that re-export the functions you want.
-
Request the module as
"node_modules/<name>". (Not"<name>"as you would in Node.)