1

アプリケーション全体で「currentUser」を使用するために、continuation-local-storage モジュールを使用しようとしています。

非同期ウォーターフォールを呼び出すと、コンテキストが失われます。

        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

0

continuation-local-storage ではなく cls-hooked を使用してみましたか。私は同様の問題を抱えていて、それを修正しました。

于 2018-12-03T00:54:37.067 に答える