diff --git a/.travis.yml b/.travis.yml index 352da14..66a9829 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,6 +3,7 @@ node_js: - "8" - "9" - "9.5.0" + - "10.4" before_install: - npm i -g npm@^5.7.0 install: diff --git a/README.md b/README.md index 8291016..684c92f 100644 --- a/README.md +++ b/README.md @@ -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 diff --git a/package.json b/package.json index c927778..9f12450 100644 --- a/package.json +++ b/package.json @@ -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", @@ -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", diff --git a/tests/express-test-harness.js b/tests/express-test-harness.js index dd88ed5..f7493da 100644 --- a/tests/express-test-harness.js +++ b/tests/express-test-harness.js @@ -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'); @@ -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(); @@ -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(); @@ -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();