1

我正在尝试使用 continuation-local-storage 模块在我的整个应用程序中使用“currentUser”。

调用异步瀑布时,上下文会丢失。

        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')})
                })
            }
        )

控制台打印是

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

解决这个问题是通过包装 ns.bind(fn2) 但这意味着需要为我有异步的地方更改整个应用程序代码。

我究竟做错了什么?

任何帮助表示赞赏:)

4

2 回答 2

1

continuation-local-storage似乎根本不适用于承诺。我发现cls-hooked确实如此(正如前面的答案已经说过的那样)。

确实很奇怪,这些库已经有 2 年历史而没有任何提交,而且似乎没有其他方法可以在节点中实现这一点......

于 2019-06-25T09:31:23.340 回答
0

您是否尝试过使用 cls-hooked 而不是 continuation-local-storage。我有一个类似的问题,它解决了它。

于 2018-12-03T00:54:37.067 回答