continuation-local-storage context is lost in async waterfall

50 views
Skip to first unread message

li...@colu.com

unread,
Jun 27, 2017, 2:55:27 PM6/27/17
to nodejs
I'm trying to use continuation-local-storage module to have "currentUser" across my entire application.

When calling async waterfall the context gets lost.
    
    app.get('/testing/cls',
    function(req, res, next) {
    ns.run(function() {
    ns.set('currentUser', req.user._id)
        return next()
    })
    },
    function(req, res) {
    function fn1(cb) {
    console.log('async fn1', ns.get('currentUser'))
    return cb()
    }
    
    function fn2(cb) {
    console.log('async fn2', ns.get('currentUser'))
    cb()
    }
    
    function fn3(cb) {
    console.log('async fn3', ns.get('currentUser'))
    cb()
    }
    
    async.waterfall([
    fn1,
    fn2,
    fn3
    ], function() {
    console.log('async waterfall done', ns.get('currentUser'))
    res.send({user: ns.get('currentUser')})
    })
    }
    )

The console prints are

    27/6/2017-11:49:39 - info: (13405) - async fn1 58a1adaslkdjh32e
    27/6/2017-11:49:39 - info: (13405) - async fn2
    27/6/2017-11:49:39 - info: (13405) - async fn3
    27/6/2017-11:49:39 - info: (13405) - async waterfall done

Fixing this problem is by wrapping ns.bind(fn2) but this means that need to change entire application code for wherever I have async.

What am I doing wrong?

Any help is appreciated :)

Jason Zheng

unread,
Jul 30, 2017, 3:57:54 PM7/30/17
to nodejs
Hello ,I am not a user of  continuation-local-storage , but  there is a more graceful way ,see here https://github.com/yyrdl/zco#3-thisctx
Reply all
Reply to author
Forward
0 new messages