context is lost on 'end' event of http request stream #36
Open
Description
Here is a sample snippet:
const http = require('http');
var createNamespace = require('cls-hooked').createNamespace;
var session = createNamespace('session-ns');
const server = http.createServer(function (request, response) {
session.run(function (ctx) {
session.set('key', 1)
read(request, response, function (req, res) {
process._rawDebug(`DONE - key: ${session.get('key')}`)
res.end(`key: ${session.get('key')}\r\n`)
})
})
})
server.listen(8080)
function read(req, res, done) {
let body = [];
req
.on('data', function (chunk) {
body.push(chunk)
})
.on('end', function () {
body = Buffer.concat(body).toString()
process._rawDebug(`End - key: ${session.get('key')}`)
done(req, res)
});
}
As you can see I have created a http server and read the body by a stream. run the snippet then use curl.
curl http://localhost:8080
console output:
End - key: 1
DONE - key: 1
for simple GET requests the context is correct, but when you send data in the body the context is lost.
curl http://localhost:8080 -X POST -d aaaaaaaaaa
console output:
End - key: undefined
DONE - key: undefined
This issues is also related to this skonves/express-http-context#4. The problem is not the body-parser package, I have tracked it down and found that it is caused by the same issue as here, the callback of 'end' event looses context.
Node runtime: reproducible on all v8.14.0, v10.4.0, v10.3.0, and v10.14.1
OS: Ubuntu 18.04
cls-hooked: 4.2.2