在 Javascript 中处理数据库查询
Processing a database query in Javascript
我正在使用 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 并 return 它使 queryDatabase 本身发挥作用。我认为可能是因为它现在被 returned 到一个子函数而不是主函数。我高度怀疑这可以很容易地解决,但我只是不知道如何解决这个问题。我在这里使用 Bluebird 看看我是否可以通过承诺解决这个问题,但我也不确定这是否是正确的路线。我也研究过回调,但我终其一生都无法弄清楚如何将这两个概念应用到我的代码中来解决我的问题。
稍后当我呈现页面时,我这样做是为了在页面上呈现它:
router.get('/', isUserAuthenticated, function(req, res) {
res.render('dashboard', {
user: req.user,
userMotto: userMottoCaught
});
});
当前在页面上生成:"Motto: [object Promise]",因为我还没有return将正确的值编辑到主函数。
有没有人能说些妙语?
干杯,
院长
我想你需要在这里回电
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);
});
}
我正在使用 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 并 return 它使 queryDatabase 本身发挥作用。我认为可能是因为它现在被 returned 到一个子函数而不是主函数。我高度怀疑这可以很容易地解决,但我只是不知道如何解决这个问题。我在这里使用 Bluebird 看看我是否可以通过承诺解决这个问题,但我也不确定这是否是正确的路线。我也研究过回调,但我终其一生都无法弄清楚如何将这两个概念应用到我的代码中来解决我的问题。
稍后当我呈现页面时,我这样做是为了在页面上呈现它:
router.get('/', isUserAuthenticated, function(req, res) {
res.render('dashboard', {
user: req.user,
userMotto: userMottoCaught
});
});
当前在页面上生成:"Motto: [object Promise]",因为我还没有return将正确的值编辑到主函数。
有没有人能说些妙语?
干杯,
院长
我想你需要在这里回电
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);
});
}