当前位置: 首页 > 面试题库 >

Node.js,Mongo查找并返回数据

贺皓
2023-03-14
问题内容

经过15年的VB6和MySql之后,我对node和mongo还是陌生的。我确定这不是我的最终程序要使用的东西,但是我需要对如何在另一个模块中调用函数并返回结果有一个基本的了解。

我希望模块具有打开数据库,在集合中查找并返回结果的功能。我可能还想在该模块中为其他集合添加更多功能。现在,我需要它尽可能简单,以后可以添加错误处理程序等。我花了几天的时间在函数周围尝试不同的方法,module.exports
= {…,但没有,.send,万事大吉。我了解它是异步的,因此程序可能在数据到达之前已经通过了显示点。

这是我在运行带有col1集合的db1数据库的Mongo上尝试过的方法。

Db1.js
var MongoClient = require('mongodb').MongoClient;
module.exports = {
    FindinCol1 : function funk1(req, res) {
    MongoClient.connect("mongodb://localhost:27017/db1", function (err,db) {
            if (err) {
                return console.dir(err);
            }
            var collection = db.collection('col1');
            collection.find().toArray(function (err, items) {
                    console.log(items);
                   // res.send(items);
                }
            );
        });
    }
};


app.js
a=require('./db1');
b=a.FindinCol1();
console.log(b);

当调用’FindinCol1’而不是console.log(b)(返回’undefined’)时,Console.log(items)工作,所以我没有得到返回或在返回时将其粘贴。我已经阅读了数十篇文章,并观看了许多视频,但是我仍然停留在这一点上。任何帮助将不胜感激。


问题答案:

如另一个答案所述,该代码是异步的,您不能简单地在回调链(嵌套函数)中返回想要的值。您需要公开一些接口,以便在您拥有所需的值(因此,将其回调或回调)后用信号通知调用代码。

在另一个答案中提供了一个回调示例,但是肯定有一个替代选项值得探讨:promises。

该模块将返回一个可以输入两种状态的已实现(已实现或已拒绝),而不是您使用所需结果调用的回调函数。调用代码等待承诺进入这两种状态之一,当它执行时将调用适当的函数。模块通过resolveing或rejecting
触发状态更改。无论如何,这是一个使用promise的例子:

db1.js:

// db1.js

var MongoClient = require('mongodb').MongoClient;

/*

node.js has native support for promises in recent versions.

If you are using an older version there are several libraries available:

bluebird, rsvp, Q. I'll use rsvp here as I'm familiar with it.

*/

var Promise = require('rsvp').Promise;



module.exports = {

  FindinCol1: function() {

    return new Promise(function(resolve, reject) {

      MongoClient.connect('mongodb://localhost:27017/db1', function(err, db) {

        if (err) {

          reject(err);

        } else {

          resolve(db);

        }

      }

    }).then(function(db) {

      return new Promise(function(resolve, reject) {

        var collection = db.collection('col1');



        collection.find().toArray(function(err, items) {

          if (err) {

            reject(err);

          } else {

            console.log(items);

            resolve(items);

          }

        });

      });

    });

  }

};





// app.js

var db = require('./db1');



db.FindinCol1().then(function(items) {

  console.info('The promise was fulfilled with items!', items);

}, function(err) {

  console.error('The promise was rejected', err, err.stack);

});

现在,更多的最新版本的node.js
mongodb驱动程序具有对Promise的本地支持,您无需做任何工作即可将回调包装在上述Promise中。如果您使用的是最新驱动程序,那么这是一个更好的示例:

// db1.js

var MongoClient = require('mongodb').MongoClient;



module.exports = {

  FindinCol1: function() {

    return MongoClient.connect('mongodb://localhost:27017/db1').then(function(db) {

      var collection = db.collection('col1');



      return collection.find().toArray();

    }).then(function(items) {

      console.log(items);

      return items;

    });

  }

};





// app.js

var db = require('./db1');



db.FindinCol1().then(function(items) {

  console.info('The promise was fulfilled with items!', items);

}, function(err) {

  console.error('The promise was rejected', err, err.stack);

});

Promise为异步控制流提供了一种极好的方法,我强烈建议您花一些时间来熟悉它们。



 类似资料:
  • 问题内容: 我有这两个模型: 我想在查找 EventBoost时 仅返回一个 事件, 而不必使用Golang逻辑执行清理。因为实际上,返回的文档具有名为 event 的属性。我直接想要一个 事件 文档。 这是我的方法,需要返回 [] * models.Event : 通过查看Mongo文档,我发现 $ project 应该可以帮助我完成我想做的事情,但是我没有找到如何将嵌套文档转换为最终文档。 问

  • 问题内容: 如何获取使用SQL Server的SQL查询返回的列数? 例如,如果我有如下查询: 它应该返回表A1中的总列数+表A2中的总列数。但是查询可能会更复杂。 问题答案: 这是一种方法: 您可以通过创建视图来执行类似的操作。

  • 我正在为Discord制作一个机器人,这个机器人的一个功能是一个级别系统。我决定从使用JSON存储数据转向使用sqlite。我正在node.js中使用sqlite3,并试图创建一个函数来创建/检索播放器的数据。我的目标是让这个函数返回查询中的数据,但我正在努力找出我做错了什么。我已经读到,我需要使用发送到查询函数的回调,但这对我来说也不起作用(对于这个函数的目标也不起作用)。 因此,任何关于如何创

  • 问题内容: 我有以下从数据库获取十六进制代码的函数 我的问题是我在回调函数中返回了结果,但getColour函数未返回任何内容。我希望getColour函数返回的值。 在我调用getColour的那一刻,它不返回任何内容 我尝试做类似的事情 但当然SELECT查询在返回值时已经完成 问题答案: 您只需要对回调中的db查询结果进行处理。就像。

  • 我正在使用一个双端队列(java.util.Dequeue),希望在队列中找到一个对象并返回它。 我目前正在使用方法检查队列是否包含对象,但不知道如何获取找到的对象的实际实例。正在搜索的实例不是同一个实例,因为我正在重写方法来测试类变量子集的相等性。 如果不可能使用退出来做到这一点,那么我应该用什么来代替呢?我需要将对象推送到列表的两端,并从一开始就将其删除。显然能够搜索一个对象并得到它的实例化。

  • 任何暗示都会很明显。