【问题标题】:Processing a database query in Javascript用 Javascript 处理数据库查询
【发布时间】:2016-09-19 09:56:54
【问题描述】:

我正在使用 Express 和 Handlebars 来显示用户设置并存储在数据库中的值。

Handlebars 设置为显示值“{{userMotto}}”。 Express 执行以下操作:

function isUserAuthenticated(req, res, next) {
    if (!req.user) {
        res.render('index', {
            user: req.user
        });
    } else {
        currentUser = req.user.username;
        userMottoCaught = queryDatabase("motto", currentUser);
        next();
    }
}

我希望它将“userMottoCaught”的值设置为它在数据库中找到的任何值。查询本身是这样的:

function queryDatabase(dbCollection, dbUID) {
    this.dbCollection = dbCollection;
    this.dbUID = dbUID;

    return MongoClient.connectAsync(hiddenkeys.mongodbUri)
        .then(function(db) {
            return db.collection(dbCollection).findOneAsync({
                _id: dbUID
            });
        })
        .then(function(item) {
            console.log("Found: ");
            console.log(item);
            return dbQueryResult;
        })
        .catch(function(err) {
            //err
        });
}

问题是我无法终生获取 dbQueryResult 并将其返回给函数 queryDatabase 本身。我想可能是因为它现在被返回到子函数而不是主函数。我高度怀疑这很容易解决,但我不知道如何解决这个问题。我在这里使用 Bluebird 来看看我是否可以通过承诺来解决这个问题,但我也不确定这是否是正确的路线。我也研究过回调,但我一生都无法弄清楚如何将这两个概念应用到我的代码中来解决我的问题。

稍后当我渲染页面时,我这样做是为了在页面上渲染它:

router.get('/', isUserAuthenticated, function(req, res) {
    res.render('dashboard', {
        user: req.user,
        userMotto: userMottoCaught
    });
});

目前这会在页面上产生:“Motto: [object Promise]”,因为我没有向主函数返回正确的值。

有没有人有一些明智的话?

干杯,

院长

【问题讨论】:

    标签: javascript mongodb express promise handlebars.js


    【解决方案1】:

    我认为您需要在这里进行回调

    function isUserAuthenticated(req, res, next) {
        if (!req.user) {
            res.render('index', {
                user: req.user
            });
        } else {
            currentUser = req.user.username;
            userMottoCaught = queryDatabase("motto", currentUser,function(err,data){
           userMottoCaught = data
           next();
           });
        }
    }
    

    queryDatabase 的定义应该是这样的

    function queryDatabase(dbCollection, dbUID,cb) {
        this.dbCollection = dbCollection;
        this.dbUID = dbUID;
    
        return MongoClient.connectAsync(hiddenkeys.mongodbUri)
            .then(function(db) {
                return db.collection(dbCollection).findOneAsync({
                    _id: dbUID
                });
            })
            .then(function(item) {
                console.log("Found: ");
                console.log(item);
                dbQueryResult = JSON.stringify(item.motto);
                cb(null,dbQueryResult)
            })
            .catch(function(err) {
                //err
                cb(err);
            });
    }
    

    【讨论】:

    • 这只需一个小改动:我仍然必须定义 dbQueryResult 等于“项目”。但是,当我想取出“next();”时会发生什么?来自 userMottoCaught 部分的参数,因为是否要在那里添加另一个查询?如果我将它向下移动一行,并进入 else 字段本身,它会失败并在页面上显示:“[object Promise]”。不过已经谢谢了:)
    猜你喜欢
    • 1970-01-01
    • 2015-07-12
    • 1970-01-01
    • 1970-01-01
    • 2016-07-19
    • 2016-10-22
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多