基本上,我想要完成的任务是从 MongoDB 数据库中提取数据并将其输入到我的 Express.js 服务器中。这两个都在具有不同地址的本地主机上运行。我尝试了多种不同的方法来让它工作,但似乎无法让它工作。
express 部分
app.get('/products', function(request, response) {
var query = request.query.keywords;
var promise = new Promise(async (resolve, reject) => {
var productList = await db.getProducts(query);
resolve(productList);
});
promise.then(function(productList) {
console.log(productList); // <--- productList is undefined here
response.json({
productList
});
}).catch('Error retrieving data');
// var productList = Promise.resolve(db.getProducts(query));
// productList.then(products => response.json({products}));
});
MongoDB 部分
StoreDB.prototype.getProducts = function(queryParams){
return this.connected.then(function(db){
// TODO: Implement functionality
const collection = db.collection('products');
var productList;
if (!queryParams){
console.log('no queryParams');
collection.find({}).toArray(function(err, docs) {
productList = convertToObject(docs);
// console.log(productList); // <--- productList is defined here
return productList;
});
////////////
一些额外信息:
- StoreDB 是一个只有一个 property
的功能类,connected,这是一个 promise ,一旦建立了与数据库的连接,就会得到解决
- Express.js 服务器调用 getProducts,然后解析 Promise
- 在 getProducts
调用中,定义了 productList
,但当它返回时,该值未定义
话虽如此,我认为通过将 getProducts
放入 Promise 中,它将等待函数调用完成,然后解决它。然而,事实并非如此。一些见解将不胜感激。谢谢。
已解决 感谢@Renan Le Caro
app.get('/products', function(request, response, next) {
db
.getProducts(request.query.keywords)
.then(productList=>response.json({productList}))
.catch(err=>next(err));
});
StoreDB.prototype.getProducts = function(queryParams){
return this.connected.then(db =>
new Promise((resolve, reject) => {
db
.collection('products')
.find({})
.toArray((err, docs) => err ? reject(err) : resolve(docs))
})
}
最佳答案
getProducts
已经是一个 Promise;你不需要将一个 Promise 包装在另一个 Promise 中,这只会让代码出现更多可能出错的地方。但是 Promise.resolve 不会等待 Promise 解析;相反,它立即返回一个新的 Promise,该 Promise 已使用您传递给它的值进行解析。那不是你想要的。当 Promise 失败时,.catch
采用一个函数来运行,而不是一个字符串。
您的代码应该像这样简单:
app.get('/products', function(request, response) {
var query = request.query.keywords;
db.getProducts(query).then(function(productList) {
console.log(productList);
response.json({
productList
});
}).catch(function() {
response.send('Error retrieving data');
});
});
或者,如果您更喜欢 async/await 语法:
app.get('/products', async function(request, response) {
var query = request.query.keywords;
try {
const productList = await db.getProducts(query);
console.log(productList);
response.json({
productList
});
} catch (err) {
response.send('Error retrieving data');
}
});
关于javascript - 当 Express.js 服务器获取时,从 MongoDB 检索的值是未定义的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58943152/