javascript - 当 Express.js 服务器获取时,从 MongoDB 检索的值是未定义的

标签 javascript node.js mongodb

基本上,我想要完成的任务是从 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/

相关文章:

mongodb - 我们如何在 Mongodb 中实现 "Select For Update"?

javascript - JS 转 PHP 错误

javascript - 如何处理克隆的幻灯片以在 SlickJS 中创建无缝的 html5 视频 slider ?

javascript - 为什么 Δ 不是 JavaScript 中的有效标识符?

javascript - Node.js 使初始化对象在所有模块中可用

mongodb - MongoException : java. lang.OutOfMemoryError:超出了GC开销限制

javascript - 通过网络应用程序打开移动设备共享对话框

node.js - 如何使用package.json保存全局包的安装?

javascript - 如何在html中的函数内部调用函数?

mongodb - 在 Mongodb 中过滤数组内部的数组