Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ node_js:
- "8"
- "9"
- "9.5.0"
- "10.4"
before_install:
- npm i -g npm@^5.7.0
install:
Expand Down
3 changes: 3 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,9 @@ To avoid weird behavior with express:
1. Make sure you require `express-http-context` in the first row of your app. Some popular packages use async which breaks CLS.
1. If you are using `body-parser` and context is getting lost, register it in express before you register `express-http-context`'s middleware.

For users of Node 10
1. Node 10.0.x - 10.3.x are not supported. V8 version 6.6 introduced a bug breaks async_hooks during async/await. Node 10.4.x uses V8 v6.7 in which the bug is fixed. See: https://github.com/nodejs/node/issues/20274.

See [Issue #4](https://github.com/skonves/express-http-context/issues/4) for more context. If you find any other weird behaviors, please feel free to open an issue.

## Contributors
Expand Down
3 changes: 1 addition & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
"description": "Get and set request-scoped context anywhere",
"main": "index.js",
"engines": {
"node": ">=8.0.0"
"node": ">=8.0.0 - <10.0.0 || >=10.4.0"
},
"scripts": {
"cover": "istanbul cover _mocha index.js -R ./tests --coverage",
Expand Down Expand Up @@ -35,7 +35,6 @@
"cls-hooked": "^4.2.2"
},
"devDependencies": {
"bluebird": "^3.5.1",
"chai": "^4.1.2",
"coveralls": "^3.0.1",
"express": "^4.16.2",
Expand Down
61 changes: 51 additions & 10 deletions tests/express-test-harness.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
const assert = require('chai').assert;
const express = require('express');
const supertest = require('supertest');
const bluebird = require('bluebird');

const httpContext = require('../index');

Expand All @@ -20,7 +19,7 @@ describe('express-http-context', function () {
assert.notOk(result);
});

it('maintains unique value across concurrent requests', function (done) {
it('maintains unique value across concurrent requests with callbacks', function (done) {
// ARRANGE
const app = express();

Expand Down Expand Up @@ -58,24 +57,25 @@ describe('express-http-context', function () {
});
});

it('maintains unique value across concurrent requests with async/await', function (done) {
it('maintains unique value across concurrent requests with native promises', function (done) {
// ARRANGE
const app = express();

app.use(httpContext.middleware);

app.get('/test', (req, res) => {
const delay = new Number(req.query.delay);
const delay = new Number(req.query.delay);
const valueFromRequest = req.query.value;

httpContext.set('value', valueFromRequest);

const doJob = async () => {
await bluebird.delay(delay);
const valueFromContext = httpContext.get('value');
res.status(200).json({
value: valueFromContext
});
const doJob = () => {
new Promise(resolve => setTimeout(resolve, delay)).then(() => {
const valueFromContext = httpContext.get('value');
res.status(200).json({
value: valueFromContext
});
});
};

doJob();
Expand All @@ -99,6 +99,47 @@ describe('express-http-context', function () {
});
});

it('maintains unique value across concurrent requests with async/await', function (done) {
// ARRANGE
const app = express();

app.use(httpContext.middleware);

app.get('/test', (req, res) => {
const delay = new Number(req.query.delay);
const valueFromRequest = req.query.value;

httpContext.set('value', valueFromRequest);

const doJob = async () => {
await new Promise(resolve => setTimeout(resolve, delay));
const valueFromContext = httpContext.get('value');
res.status(200).json({
value: valueFromContext
});
};

doJob();
});

const sut = supertest(app);

const value1 = 'value1';
const value2 = 'value2';

// ACT
sut.get('/test').query({ delay: 100, value: value1 }).end((err, res) => {
// ASSERT
assert.equal(res.body.value, value1);
done();
});

sut.get('/test').query({ delay: 50, value: value2 }).end((err, res) => {
// ASSERT
assert.equal(res.body.value, value2);
});
});

it('returns undefined when key is not found', function (done) {
// ARRANGE
const app = express();
Expand Down