https://github.com/lstkz/decorate-it
Logging and validation decorators for nodejs services
https://github.com/lstkz/decorate-it
Last synced: 3 months ago
JSON representation
Logging and validation decorators for nodejs services
- Host: GitHub
- URL: https://github.com/lstkz/decorate-it
- Owner: lstkz
- License: mit
- Created: 2016-09-21T14:50:52.000Z (over 8 years ago)
- Default Branch: master
- Last Pushed: 2018-12-03T12:57:11.000Z (over 6 years ago)
- Last Synced: 2025-02-18T05:47:04.644Z (4 months ago)
- Language: JavaScript
- Homepage:
- Size: 24.4 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# decorate-it
[](https://travis-ci.org/lsentkiewicz/decorate-it)
[](https://codecov.io/gh/lsentkiewicz/decorate-it)Decorate-it is a simple library for validation and logging.
It depends on [joi](https://github.com/hapijs/joi) (validator) and [bunyan](https://github.com/trentm/node-bunyan) (logger)## Installation
```
npm i --save decorate-it
```## Sample usage
file `services/CalcService.js`
```js
import Joi from 'joi';
import decorate from 'decorate-it';function add(a, b) {
return a + b;
}add.sync = true;
add.schema = {
a: Joi.number().required(),
b: Joi.number().required(),
};// create your service
const CalcService = {
add,
};// decorate it, it will mutate CalcService
decorate(CalcService, 'CalcService');export default CalcService;
```
use service
```js
import CalcService from './services/CalcService';CalcService.add(1, 3); // returns 4
CalcService.add('5', '6'); // returns 11, input parameters are converted to number types
CalcService.add('1', { foo: 'bar' }); // logs and throws an error
```
See example under `example/example1.js`. Run it using `npm run example1`.
## Async sample usage
file `services/UserService.js`
```js
import Joi from 'joi';
import decorate from 'decorate-it';async function getUser(id) {
if (id === 1) {
return await new Promise((resolve) => {
setTimeout(() => resolve({ id: 1, username: 'john' }), 100);
});
}
throw new Error('User not found');
}
getUser.sync = false; // optional, false by default
getUser.params = ['id'];
getUser.schema = {
id: Joi.number().required(),
};// create your service
const UserService = {
getUser,
};// decorate it, it will mutate UserService
decorate(UserService, 'UserService');export default UserService;
```
use service
```js
import UserService from './services/UserService';await UserService.getUser(1); // returns { id: 1, username: 'john' }
await UserService.getUser(222); // throws 'User not found'
```
See example under `example/example2.js`. Run it using `npm run example2`.
**NOTE** parameter names cannot be automatically retrieved from `async` methods.
You must define them explicitly in `params` property like this `getUser.params = ['id'];`## Removing security information
By default properties `password`, `token`, `accessToken` are removed from logging.
Additionally you can define `removeOutput = true` to remove the method result.
Example:file `services/SecurityService.js`
```js
import Joi from 'joi';
import decorate from 'decorate-it';function hashPassword(password) {
return 'ba817ef716'; // hash password here
}hashPassword.removeOutput = true;
hashPassword.schema = {
password: Joi.string().required(),
};// create your service
const SecurityService = {
hashPassword,
};// decorate it, it will mutate SecurityService
decorate(SecurityService, 'SecurityService');export default SecurityService;
```
use service
```js
import SecurityService from './services/SecurityService';SecurityService.hashPassword('secret-password');
```
See example under `example/example3.js`. Run it using `npm run example3`.
## Configuration
```
import decorate from 'decorate-it';decorate.configure({
removeFields: Array, // the array of fields not won't be logged to the console, default: ['password', 'token', 'accessToken'],
debug: true/false, // the flag is parameter/ouput logging is enabled, (errors are always enabled), default: true
depth: number, // the object depth level when serializing, default: 4
maxArrayLength: number, // the maximum number of elements to include when formatting an array, default: 30
})
```You must configure it, before creating any service.
## Special properties
if the parameter name is `req` it's assumed that the object is an express request.
Only properties are logged: `method`, `url`, `headers`, `remoteAddress`, `remotePort`.if the parameter name is `res` it's assumed that the object is an express response.
Only properties are logged: `statusCode`, `header`.MIT License
Copyright (c) 2016 Łukasz Sentkiewicz