如何在节点快速路由器中沿承诺链向下“传输”变量

How to "transfer" variables down the promise chain in node express router?

本文关键字:传输 变量 承诺 节点 路由器      更新时间:2023-09-26

我正在尝试在承诺链中进行两次单独的数据库调用,尽管出于测试目的,第一次调用被传递的简单字符串所取代。

我的问题是我无法访问第二个承诺中的变量 msg(我尝试设置 context.foo = msg。

router.route("/")
.get(function(request, response) {
    var session = request.session;
    return new Promise(function(resolve, reject) {
        resolve("h!");
    }).then(function(msg){
        return new Promise(function(resolve, reject) {
            Snippet.find({}, function(error, data) {
                let context = {
                    snippets: data.map(function(snippet) {
                        return {
                            name: snippet.name,
                            snippet: snippet.snippet,
                            createdAt: snippet.createdAt,
                            user: snippet.user,
                            id: snippet._id
                        };
                    }),
                  foo: msg
                };
                resolve(context);
            });
        });
    }).then(function(context){
        response.render("start/index", context);
    }).catch(function(err){
        response.end(err);
    });
});

另一个尝试,这里试图将路由器绑定到承诺......

 router.route("/")
.get(function(request, response) {
    var session = request.session;
    return new Promise(function(resolve, reject) {
        resolve("hi!");
    }).then(function(msg){
        router.msg = msg;
        return new Promise(function(resolve, reject) {
            Snippet.find({}, function(error, data) {
                let context = {
                    snippets: data.map(function(snippet) {
                        return {
                            name: snippet.name,
                            snippet: snippet.snippet,
                            createdAt: snippet.createdAt,
                            user: snippet.user,
                            id: snippet._id
                        };
                    }),
                  foo: this.msg
                };
                resolve(context);
            }.bind(router));
        });

第三次尝试...

router.route("/")
.get(function(request, response) {
    var session = request.session;
    return new Promise(function(resolve, reject) {
        context.msg = "hi!";
        resolve(context);
    }).then(function(context){
        return new Promise(function(resolve, reject) {
            Snippet.find({}, function(error, data) {
                context.snippets = {
                    snippets: data.map(function(snippet) {
                        return {
                            name: snippet.name,
                            snippet: snippet.snippet,
                            createdAt: snippet.createdAt,
                            user: snippet.user,
                            id: snippet._id
                        };
                    }),
                };
                resolve(context);
            });
        });
    }).then(function(context){
        response.render("start/index", context);
    }).catch(function(err){
        response.end(err);
    });
});

所以基本问题始终是,当我没有周围的对象,没有"this"将其附加到 =)

使用蓝鸟强大的Promise.coroutine()

router.route("/")
.get(Promise.coroutine(function*(request, response) {
    try {
        const dbResult1 = yield getValueFromDatabaseAsync(/* w/e */);
        const dbResult2 = yield getValueFromDatabaseAsync(/* w/e, can be dbResult1 */);
        const context = {...}; // use dbResult1 and dbResult2 here normally
        response.render("start/index", context);
    } catch (err) {
        response.end(err);
    }
}));