(nearly) zero-cost bindings to express
Run the following in your console:
$ yarn add rescript-express expressThen add rescript-express to your bsconfig.json's bs-dependencies:
{
"bs-dependencies": [
+ "rescript-express"
]
}For now, due to compability issues between commonJS and ES6 module, the bindings expose two express functions:
expressfor ES6expressCjsto CommonJS
Be careful to pick the right one given your compiler's configuration.
The API closely matches the express one. You can refer to the express docs.
express.json,express.raw,express.text,express.urlencoded,express.staticare all suffixed withMiddlewareto prevent name clashing.accept*andisreturn an option intead of a string/booleanreq.getis calledgetRequestHeaderandres.getis calledgetResponseHeader
You can check the interface file to see the exposed APIs.
open Express
let app = express()
app->use(jsonMiddleware())
app->get("/", (_req, res) => {
let _ = res->status(200)->json({"ok": true})
})
app->post("/ping", (req, res) => {
let body = req->body
let _ = switch body["name"]->Js.Nullable.toOption {
| Some(name) => res->status(200)->json({"message": `Hello ${name}`})
| None => res->status(400)->json({"error": `Missing name`})
}
})
app->useWithError((err, _req, res, _next) => {
Js.Console.error(err)
let _ = res->status(500)->endWithData("An error occured")
})
let port = 8081
let _ = app->listenWithCallback(port, _ => {
Js.Console.log(`Listening on http://localhost:${port->Belt.Int.toString}`)
})Generates the following
var Express = require("express");
var app = Express();
app.use(Express.json());
app.get("/", function (_req, res) {
res.status(200).json({
ok: true,
});
});
app.post("/ping", function (req, res) {
var body = req.body;
var name = body.name;
if (name == null) {
res.status(400).json({
error: "Missing name",
});
} else {
res.status(200).json({
message: "Hello " + name,
});
}
});
app.use(function (err, _req, res, _next) {
console.error(err);
res.status(500).end("An error occured");
});
app.listen(8081, function (param) {
console.log("Listening on http://localhost:" + String(8081));
});