SBackend - backend framework based on express
- Init node project
- Type this in console
npm i sbackend
esm
import SBackend from "sbackend";
let app = new SBackend();
app.start();
// or
app.startAsync();
cjs
const SBackend = require("sbackend")
let app = new SBackend();
app.start();
// or
app.startAsync();
Server will log:
--++== app v0.0.0; port: 8080 ==++--
let app = new SBackend({
port: 8888,
name: "test",
version: "0.0.1"
});
Server will log:
--++== test v0.0.1; port: 8888 ==++--
let app = new SBackend({
port: 8888,
name: "test",
version: "0.0.0",
logPath: "./latest.log"
});
console.log("test");
In console:
2023.3.30 13:41:0: info: test
--++== test v0.0.0; port: 8888 ==++--
In latest.log:
2023.3.30 14:22:44: info: test
--++== test v0.0.0; port: 8888 ==++--
Why does our message was logged before "--++== test v0.0.0; port: 8888 ==++--"?
Because server was started after it.
app.start();
app.logger.message("test");
This message will be logged before "--++== test v0.0.0; port: 8888 ==++--".
How can we handle server starting? Using start callback.
let server = app.start(() => {
app.logger.message("test");
});
// or
app.startAsync().then(server => {
app.logger.message("test");
});
// server is http.Server
Server will log:
--++== test v0.0.0; port: 8888 ==++--
2023.3.30 15:19:37: info: test
app.post("/post", (request, response) => {
console.log({
request: request.body,
url: request.url,
query: request.query,
params: request.params,
headers: request.headers,
afterRoute: request.afterRoute
});
response.status(200);
response.end("ok");
});
Server will log (after handling request):
--++== test v0.0.0; port: 8888 ==++--
2023.3.30 15:32:58: info: {
"request": {},
"url": "/post?test=test&test0=0&test1=true",
"query": "test=test&test0=0&test1=true"
"params": {},
"headers": {
"content-type": "text/plain",
"host": "localhost:8888",
"accept-encoding": "gzip, deflate, br",
"connection": "keep-alive",
"content-length": 2
},
"afterRoute": "t?test=test&test0=0&test1=true"
}
2023.3.30 15:32:58: request: Handled request to /post?test=test&test0=0&test1=true. Code: 200. Request: {}. Response: "ok"
app.get("/get", (request, response) => {
console.log({
url: request.url,
query: request.query,
params: request.params,
headers: request.headers,
afterRoute: request.afterRoute
});
response.status(200);
response.end("ok");
});
Server will log (after handling request):
--++== test v0.0.0; port: 8888 ==++--
2023.3.30 15:36:47: info: {
"url": "/get?test=test&test0=0&test1=true",
"query": "test=test&test0=0&test1=true"
"params": {},
"headers": {
"user-agent": "PostmanRuntime/7.31.3",
"accept": "*/*",
"postman-token": "a348e587-306a-4e91-bc38-647e9502bc39",
"host": "localhost:8888",
"accept-encoding": "gzip, deflate, br",
"connection": "keep-alive"
},
"afterRoute": "t?test=test&test0=0&test1=true"
}
2023.3.30 15:36:47: request: Handled request to /get?test=test&test0=0&test1=true. Code: 200. Response: "ok"
import SBackend from "sbackend";
let app = new SBackend({
port: 8888,
name: "test",
version: "0.0.0",
logPath: "./latest.log"
});
app.addHandler("/other", "put", (request, response) => {
console.log({
url: request.url,
query: request.query,
params: request.params,
headers: request.headers,
afterRoute: request.afterRoute
});
response.status(200);
response.end("ok");
});
app.start();
import SBackend from "sbackend";
import handlers from "./handlers.js";
let app = new SBackend({
port: 8888,
name: "test",
version: "0.0.0",
logPath: "./latest.log"
});
app.addHandlers(handlers);
app.start();
export default {
post: {
"/post"(request, response) {
this.logger.message("POST");
console.log({
request: request.body,
url: request.url,
query: request.query,
params: request.params,
headers: request.headers,
afterRoute: request.afterRoute
});
response.status(200);
response.end("ok");
}
},
get: {
"/get"(request, response) {
this.logger.message("GET");
console.log({
url: request.url,
query: request.query,
params: request.params,
headers: request.headers,
afterRoute: request.afterRoute
});
response.status(200);
response.end("ok");
}
}
}
Server will log (after handling requests):
--++== test v0.0.0; port: 8888 ==++--
2023.3.30 17:45:0: info: POST
2023.3.30 17:45:0: info: {
"request": {
"test": "test",
"test0": 0,
"test1": true
},
"url": "/post?test=test&test0=0&test1=true",
"query": "test=test&test0=0&test1=true"
"params": {},
"headers": {
"content-type": "application/json",
"user-agent": "PostmanRuntime/7.31.3",
"accept": "*/*",
"postman-token": "750d0b9f-a395-4bae-8022-a15f42354219",
"host": "localhost:8888",
"accept-encoding": "gzip, deflate, br",
"connection": "keep-alive",
"content-length": 61
},
"afterRoute": "t?test=test&test0=0&test1=true"
}
2023.3.30 17:45:0: request: Handled request to /post?test=test&test0=0&test1=true. Code: 200. Request: {
"test": "test",
"test0": 0,
"test1": true
}. Response: "ok"
2023.3.30 17:45:10: info: GET
2023.3.30 17:45:10: info: {
"url": "/get?test=test&test0=0&test1=true",
"query": {
"test": "test",
"test0": 0,
"test1": true
}
"params": {},
"headers": {
"user-agent": "PostmanRuntime/7.31.3",
"accept": "*/*",
"postman-token": "2797a3f5-4868-4db6-8804-8d301cd67f55",
"host": "localhost:8888",
"accept-encoding": "gzip, deflate, br",
"connection": "keep-alive"
},
"afterRoute": "t?test=test&test0=0&test1=true"
}
2023.3.30 17:45:10: request: Handled request to /get?test=test&test0=0&test1=true. Code: 200. Response: "ok"
2023.3.30 17:45:12: info: raw GET
app.addFile("/file", path.resolve("./main.js"));
Server will log (after handling request):
--++== test v0.0.0; port: 8888 ==++--
2023.3.30 17:58:27: request: Handled request to /file
app.addFolder("/folder", path.resolve("."));
Server will log (after handling request):
--++== test v0.0.0; port: 8888 ==++--
2023.3.30 18:5:59: request: Handled request to /folder/main.js
2023.3.30 18:5:59: request: Handled request to /folder/handlers.js
app.addPath("/file", path.resolve("./main.js"));
app.addPath("/folder", path.resolve("."));
app.addHandlers({
paths: {
"/file": path.resolve("./main.js"),
"/folder": path.resolve(".")
}
});
or
app.addHandlers({
files: {
"/file": path.resolve("./main.js")
},
folders: {
"/folder": path.resolve(".")
}
});
Server will log (after handling request):
--++== test v0.0.0; port: 8888 ==++--
2023.3.30 18:11:3: request: Handled request to /file
2023.3.30 18:11:23: request: Handled request to /folder/main.js
import SBackend from "sbackend";
import path from "path";
import files from "./files.json" assert { type: "json" };
let app = new SBackend({
port: 8888,
name: "test",
version: "0.0.0",
logPath: "./latest.log"
});
app.addFilesJson(files, p => path.resolve(p));
app.start();
{
"/log": "./latest.log",
"/srequest": "./sRequest.js",
"/functions": "./sBackend/files.mjs",
"/folder": "."
}
app.addKeyboardCommand("test", data => {
app.logger.message(data);
});
app.defaultKeyboardHandler = data => {
app.logger.message(data);
};
app.pause();
app.resume();
app.restart();
app.stop();
app.addKeyboardCommand("stop", () => app.stop());
app.on("start", () => {app.logger.message("Server started")});
app.on("pause", () => {app.logger.message("Server paused")});
app.on("resume", () => {app.logger.message("Server resumed")});
app.on("stop", () => {app.logger.message("Server stopped")});
app.on("restart", () => {app.logger.message("Server restarted")});
or
app.onStart(() => {app.logger.message("Server started")});
app.onPause(() => {app.logger.message("Server paused")});
app.onResume(() => {app.logger.message("Server resumed")});
app.onStop(() => {app.logger.message("Server stopped")});
app.onRestart(() => {app.logger.message("Server restarted")});
import * as files from "sbackend/utils.mjs";
let file = new files.File("test.txt");
file.write("SBackend");
file.append(" test file");
console.log(file.read()); // SBackend test file
let file2 = new files.File("test.json");
file.writeObject({
port: 8888,
name: "test",
version: "0.0.0",
logPath: "./latest.log"
});
console.log(file.read()) // {"test": "test", "test0": 0, "test1": true}
let file = new files.File("test.txt", "utf-8");
// or
let file = new files.File("test.txt", {
encoding: "utf-8"
});
let file = new files.File("test.txt", encoding);
// or
let file = new files.File("test.txt", fsOptions);
import SBackend from "sbackend";
import handlers from "./handlers.js";
import path from "path";
let app = new SBackend({
port: 8888,
name: "test",
version: "0.0.0",
logPath: "./latest.log"
});
app.addHandlers(handlers);
app.addHandlers({
paths: {
"/file": path.resolve("./main.js"),
"/folder": path.resolve(".")
}
});
app.start(() => {
app.logger.message(app.routes);
});
--++== test v0.0.0; port: 8888 ==++--
2023.5.30 9:43:31: info: [
{ route: '/post', type: 'post' },
{ route: '/get', type: 'get' },
{
route: '/file',
path: '/media/sizoff/sizoff/Programming/Jet_Brains/Javascript/SBackend/main.js'
},
{
route: '/folder/*',
dir: '/media/sizoff/sizoff/Programming/Jet_Brains/Javascript/SBackend'
}
]
import SBackend from "sbackend";
let app = new SBackend();
app.setConfig({
port: 8888,
name: "test",
version: "0.0.0",
logPath: "./latest.log"
});
app.start();
app.question("test", text => {
app.logger.success("ok");
app.logger.message(text);
});