express-cls-hooked

Get and set request-scoped context anywhere

Downloads in past

Stats

StarsIssuesVersionUpdatedCreatedSize
express-cls-hooked
800.3.85 years ago5 years agoMinified + gzip package size for express-cls-hooked in KB

Readme

travis coveralls npm npm david
Express HTTP Context with asynchooks
This package is forked from express-http-context. It is using cls-hooked which is a fork of continuation-local-storage that uses asynchooks API, so context is preserved even over async/await in node 8+. If you're using node version < 8, just use the original express-http-context.
Get and set request-scoped context anywhere. This is just an unopinionated, idiomatic ExpressJS implementation of continuation-local-storage
. It's a great place to store user state, claims from a JWT, request/correlation IDs, and any other request-scoped data.

How to use it

Install: npm install --save express-cls-hooked
Use the middleware. The earlier the better; you won't have access to the context from any middleware "used" before this one.
var express = require('express');
var httpContext = require('express-cls-hooked');

var app = express();

app.use(httpContext.middleware);
// all code from here on has access to the same context for each request

Set values based on the incomming request:
// Example authorization middleware
app.use((req, res, next) => {
	userService.getUser(req.get('Authorization'), (err, result) => {
		if (err) {
			next(err);
		} else {
			httpContext.set('user', result.user)
			next();
		}
	});
});

Get them from code that doesn't have access to the express req object:
var httpContext = require('express-cls-hooked');

// Somewhere deep in the Todo Service
function createTodoItem(title, content, callback) {
	var user = httpContext.get('user');
	db.insert({ title, content, userId: user.id }, callback);
}

Troubleshooting

To avoid weird behavior with express:
  1. Make sure you require express-cls-hooked in the first row of your app. Some popular packages use async which breaks CLS.
  2. If you are using body-parser and context is getting lost, register it in express before you register express-cls-hooked's middleware.

See Issue #4 for more context. If you find any other weird behaviors, please feel free to open an issue.