Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/bloodyowl/rescript-express
Experimental (nearly zero-cost) bindings to express
https://github.com/bloodyowl/rescript-express
Last synced: about 10 hours ago
JSON representation
Experimental (nearly zero-cost) bindings to express
- Host: GitHub
- URL: https://github.com/bloodyowl/rescript-express
- Owner: bloodyowl
- Created: 2021-03-16T11:01:15.000Z (almost 4 years ago)
- Default Branch: main
- Last Pushed: 2023-11-14T10:58:55.000Z (about 1 year ago)
- Last Synced: 2024-11-25T18:43:24.823Z (2 months ago)
- Language: ReScript
- Size: 41 KB
- Stars: 79
- Watchers: 6
- Forks: 10
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
- Changelog: HISTORY.md
- Funding: .github/FUNDING.yml
Awesome Lists containing this project
- awesome-luooooob - bloodyowl/rescript-express - Experimental (nearly zero-cost) bindings to express (ReScript)
- awesome-list - rescript-express - cost) bindings to express | bloodyowl | 44 | (ReScript)
README
# rescript-express
> (nearly) zero-cost bindings to express
## Installation
Run the following in your console:
```console
$ yarn add rescript-express express
```Then add `rescript-express` to your `bsconfig.json`'s `bs-dependencies`:
```diff
{
"bs-dependencies": [
+ "rescript-express"
]
}
```## Module system
For now, due to compability issues between commonJS and ES6 module, the bindings expose two `express` functions:
- `express` for ES6
- `expressCjs` to CommonJSBe careful to pick the right one given your compiler's configuration.
## API
The API closely matches the express one. You can refer to the [express docs](https://expressjs.com/en/4x/api.html).
### Notable differences
- `express.json`, `express.raw`, `express.text`, `express.urlencoded`, `express.static` are all suffixed with `Middleware` to prevent name clashing.
- `accept*` and `is` return an option intead of a string/boolean
- `req.get` is called `getRequestHeader` and `res.get` is called `getResponseHeader`You can check [the interface file](./src/Express.resi) to see the exposed APIs.
## Example
```rescript
open Expresslet 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
```js
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));
});
```