Skip to content

Instantly share code, notes, and snippets.

View aigoncharov's full-sized avatar

Andrey Goncharov aigoncharov

View GitHub Profile
const controller = (req, res, next) => {
loggerCls.info('Long live rocknroll!')
// Logs something like
// {"level":30,"time":1551385666046,"msg":"Long live rocknroll!","pid":25,"hostname":"eb6a6c70f5c4","traceID":"9ba393f0-ec8c-4396-8092-b7e4b6f375b5","v":1}
}
const cls = require('cls-hooked')
const uuidv4 = require('uuid/v4')
const clsMiddleware = (req, res, next) => {
// req and res are event emitters. We want to access CLS context inside of their event callbacks
clsNamespace.bind(req)
clsNamespace.bind(res)
const traceID = uuidv4()
const loggerWithTraceId = logger.child({ traceID })
const pino = require('pino')
const logger = pino()
const loggerCls = new Proxy(logger, {
get(target, property, receiver) {
// Fallback to our original logger if there is no child logger in CLS
target = clsNamespace.get('loggerCls') || target
return Reflect.get(target, property, receiver)
},
})
const { createLogger, format, transports } = require('winston')
const addTraceId = printf((info) => {
let message = info.message
const traceID = clsNamespace.get('taceID')
if (traceID) {
message = `[TraceID: ${traceID}]: ${message}`
}
return message
})
const controller = (req, res, next) => {
const traceID = clsNamespace.get('traceID')
}
const cls = require('cls-hooked')
const uuidv4 = require('uuid/v4')
const clsNamespace = cls.createNamespace('app')
const clsMiddleware = (req, res, next) => {
// req and res are event emitters. We want to access CLS context inside of their event callbacks
clsNamespace.bind(req)
clsNamespace.bind(res)
@aigoncharov
aigoncharov / class-based-reducers-7.js
Created February 11, 2019 19:50
Reducer organization - taking a step further
// We move that generic code to a dedicated module
import { Action, createClassReducer } from 'utils/reducer-class'
const actionTypeJediCreateInit = 'jedi-app/jedi-create-init'
const actionTypeJediCreateSuccess = 'jedi-app/jedi-create-success'
const actionTypeJediCreateError = 'jedi-app/jedi-create-error'
class ReducerJedi {
// Take a look at "Class field delcaratrions" proposal, which is now at Stage 3.
// https://github.com/tc39/proposal-class-fields
@aigoncharov
aigoncharov / class-based-reducers-6.js
Created February 11, 2019 19:47
Reducer organization - taking a step further
const reducerJedi = createClassReducer(ReducerJedi)
@aigoncharov
aigoncharov / class-based-reducers-5.js
Created February 11, 2019 19:44
Reducer organization - taking a step further
import { createReducer } from 'redux-create-reducer'
const createClassReducer = (ReducerClass) => {
const reducerClass = new ReducerClass()
const methodsWithActionTypes = getReducerClassMethodsWthActionTypes(
reducerClass,
)
const reducerMap = getReducerMap(methodsWithActionTypes)
const initialState = reducerClass.initialState
const reducer = createReducer(initialState, reducerMap)
@aigoncharov
aigoncharov / class-based-reducers-4.js
Created February 11, 2019 19:40
Reducer organization - taking a step further
const getReducerMap = (methodsWithActionTypes) =>
methodsWithActionTypes.reduce((reducerMap, { method, actionType }) => {
reducerMap[actionType] = method
return reducerMap
}, {})