A node.js web server boilerplate using Fastify as server framework by default. In its current state, the project is ideal for serving APIs.
npm startA SSL certificate is not needed in this case, the server will run on HTTP.
npm run devThe default route path should be indicated in the config file config.json. An example route path shown in config.json.example points to src/components/network/router/routes. Note that the path listed in the config file is relative to the path of Router.ts. You can add subfolders in the routes folder as it will be read recursively by the router.
Each route has a property route, which returns a RouteModel. This defines all the attributes of the route. The route schema gets its components from Fastify.
import { Route } from "../NetRoute";
import { RouteModel } from "../RouteModel";
import { Router } from "../Router";
class Index extends Route {
private str: string = 'world';
constructor() {
super();
this.initialise(this.route());
}
protected route(): RouteModel {
return new RouteModel({
method: 'GET',
endpoint: '/',
schema : null,
handler: this.process.bind(this)
});
}
public async process(request: any, reply: any) {
await super.process(request, reply);
const str = (
`<p>hello <b>${this.str}</b>!</p>`
);
reply.send(str);
}
}
module.exports = { Route: Index };protected route(): RouteModel {
return new RouteModel({
method: 'POST',
endpoint: '/login',
schema : {
body {
username: { type: 'string', required: true },
password: { type: 'string', required: true },
email: { type: 'string' } // 'required' is false by default
}
},
handler: this.process.bind(this)
});
}protected route(): RouteModel {
return new RouteModel({
method: 'POST',
endpoint: '/publish',
auth: true,
schema : {
body {
title: { type: 'string', required: true },
content: { type: 'string', required: true }
}
},
handler: this.process.bind(this)
});
}Authentication is handled in NetRoute.ts under the method isAuthenticated. You should examine the request and define if the user is authenticated (e.g using tokens) and return a corresponding boolean.
static isAuthenticated(route: RouteModel, request: any): boolean {
if (request.headers['token'] == null)
return false;
return Token.validate(request.headers['token']);
}