Fastro is web framework for developers who are obsessed with simplicity & performance.
It is inspired by Express, Fastify, Nest & Firebase.
import { Fastro } from "https://raw.githubusercontent.com/fastrodev/fastro/v0.11.3/mod.ts";
const server = new Fastro();
server.get("/", (req) => req.send("root"));
await server.listen();
Benchmarks
If performance is really important to you, here are the Hello World
benchmark results. Check this folder to see the details.
Framework | Version | Router? | Avg Req |
---|---|---|---|
Deno http | 1.1.0 | ✗ | 17269.2 |
Fastro | 0.11.3 | ✓ | 14845.2 |
Node http | 14.3.0 | ✗ | 14681.2 |
Fastify | 2.14.1 | ✓ | 12544.6 |
Oak | 5.2.0 | ✓ | 10365.4 |
Abc | 1.0.0-rc10 | ✓ | 9831.6 |
Express | 4.17.1 | ✓ | 6931.37 |
PHP | 7.3.11 | ✗ | 6052.19 |
Python Flask | 1.1.2 | ✓ | 568.91 |
How to use
This module uses the git release. If you want to pick a specific version, for example 0.11.3
, then the full url is https://raw.githubusercontent.com/fastrodev/fastro/v0.11.3/mod.ts
. If you do not use the version, it will refer to master
branch. Breaking changes may be made without warning.
Middleware
You can add new properties or functions for specific URL to the default request
. This is similar to the express middleware.
const middleware = (req: Request, done: Function) => {
req.oke = () => req.send("oke");
done();
};
server
.use(middleware)
.get("/", (req) => req.oke());
Decorator
Another way to add a new property or function globally to the fastro instance and request
object is to use a decorator. This is similar to the fastify decorator.
server
.decorate((instance) => instance.ok = "ok")
.decorate((instance) => instance.hello = (payload: string) => payload)
.decorateRequest((req) => req.oke = "oke request");
server
.get("/", (req) => req.send(server.ok))
.get("/hello", (req) => req.send(server.hello("hello")))
.get("/oke", (req) => req.send(req.oke));
Plugin
You can add new properties or functions to the fastro instance. You can also use all default instance functions, include decorator, create routes & middleware. This is similar to the fastify plugin.
const routes = function (fastro: Fastro, done: Function) {
fastro
.get("/", (req) => req.send("root"))
.post("/", (req) => req.send("post"))
.put("/", (req) => req.send("put"))
.delete("/", (req) => req.send("delete"));
done();
};
server.register(routes);
Dependency Injection
With dependency injection you can create complex applications with clean code. No longer need to manually import handlers and services. You only make a class and add typescript decorator to define gateway
, controller
, service
and route
. Fastro will automatically load, register and create them for you. This is similar to nest.
import { Controller, Get, Request } from "https://raw.githubusercontent.com/fastrodev/fastro/v0.11.3/mod.ts";
@Controller()
class Greet {
@Get()
handler(req: Request) {
req.send("root");
}
}
Function
With functions, you only need to define the main url and the handler. There is no need to define a method, so you can use all types of http methods. You can also get the url parameters more dynamically without defining the full url.
server.function("/prefix/function", (req) => {
if (!req.url.includes("/prefix/function")) return server.forward(req);
req.send(req.functionParameter);
});
Please note, in this version
dependency-injection
cannot be used infastro-function
.
Examples
Check this folder to find out how to:
- create hello world app
- change default port & add optional listen callback
- send simple text & json data
- get url parameters
- get json/text payload from post method
- set custom http headers & status
- create simple jwt auth
- create middleware
- create decorator to add new property
- create router with plugin
- create nested plugin
- create simple REST API
- create simple REST API with JWT
- create dependency injection
- create fastro function