A collection of Node.js ultilities for creating scalable backend services.
This package is a summarization from my own experience working as a backend engineer during the last 3 years. It is suitable for both software and api development.
Write simple and single threaded RESTfull APIs with declaritive code style.
Create a simple HTTP server with just 5 lines of code:
import { SandraCore } from "sandrasoft";
const config = {
apiRoot: '/api',
port: process.env.PORT,
};
const app = new SandraCore(config);
app.startListening();
Or create an HTTPS server with useHttps
method:
import { SandraCore } from "sandrasoft";
const config = {
apiRoot: '/api',
port: process.env.PORT,
useHttps: {
keyFilePath: './private/server.key';
certFilePath: './private/server.crt';
passphrase: 'sample';
}
};
const app = new Server(config);
app.startListening();
You can apply middlewares into sandracore instances:
const app = new Server(config);
app.set('view engine', 'ejs');
app.use(morgan('dev'));
app.use(express.json());
app.startListening();
If you prefer express coding style, then do the following:
const server = new Server(config);
const app = server.getInstance();
app.use('/', express.static(path.join(process.cwd(), 'public')));
app.set('views', path.join(process.cwd(), 'views'));
app.set('view engine', 'ejs');
server.startListening();
By default, the following middlewares are automatically added when new sandracore instance is created:
Create a RESTfull API endpoint with this code style:
const UserLoginRouter = {
method: 'POST',
paths: ['/user/login'],
validations: {
body: {
email: ['isEmail'],
password: ['!isEmpty'],
},
},
middlewares: [],
controller: async (req: Request) => {
const {email, password} = req.body;
return await UserService.login(email, password);
}
}
app.applyRoutes({ UserLoginRouter });
Supported functions for validations: see validator.js
The current version of sandrasoft
only supports validator functions whose accept only 1 param.
For example: isEmail(str)
is supported while equals(str, comparison)
does not.
Pull request for this feature is pretty much welcomed 💪
Middlewares that are specific to a router can be applied by the following:
import * as multer from "multer";
const UpdateAvatarRouter = {
method: 'POST',
paths: ['/user/avatar'],
middlewares: [
/* this middleware looks for authorization token in headers */
(req: Request, res: Response, next: NextFunction) => {
if (!req.headers['authorization']) {
next(new Error('User not logged in'))
}
next();
},
/* this middleware uses multer library to handle file upload */
multer({ storage: multer.memoryStorage() }).single('fileUpload');
],
controller: async (req: Request) => {
/* do something with req.file, given by multer */
}
}
app.applyRoutes({ UpdateAvatarRouter });
Success response schema
{
"statusCode": 200,
"data": "Success reponse can be type of any"
}
Error response schema
{
"statusCode": 500,
"error": "Error message returned from router's controller or middlewares"
}
Documentation comming soon...
Documentation comming soon...