如何在mongoose模型中使用find方法的callback结果

我使用mongoose作为nodejs-mongodb应用程序的ODM。

是我的第一个nodejs应用程序,我来自一个非函数式的编程背景。

看着mongoose的文档 ,你可以find:

Kitten.find(function (err, kittens) { if (err) return console.error(err); console.log(kittens); }); 

好极了,在这里我们有find函数作为我们模型的一部分(Kitten),它实际上可以find文档,并在callback函数中将其作为“kittens”检索,在这种情况下,它使用console.log()。

但是我想知道如何使用这个函数式编程来将这个值赋给一个variables(因为我在模型文件夹的另一个文件中有这个值,并且导入了需要的模块)

我发现了另外一个关于ObjectId类似请求的问题,但是当您使用callback来使用console.log来打印答案时,它们提供了同样的答案。如果我们诚实地说,这是没有用的。

因为我来自一个非函数式的编程背景,所以我期望的是:

 var kitten = Kitten.find({name:'Silence'}); 

据我所知,如果你在callback中指定了一个新的variables,variables的作用域就在callback函数中,和返回variables一样,甚至在方法不能工作之前声明一个variables。

我确定有什么我错过了。 这个项目是如此之大,我不认为他们不能忘记提供一个方法来做到这一点。 我认为在函数式编程中我有一些东西缺less,或者我不知道。

那么,怎样才能做到这一点呢?

谢谢 !

编辑:我不知道为什么社区说我的问题是一个可能的重复如何从asynchronous调用返回响应? 这个问题更多地面向js ajaxasynchronous一般,这个问题是面向ODM框架,以及如何处理的结果,它可以通过承诺也是一个不同的东西

我想告诉你,像访问你的数据库和检索数据这样的操作是asynchronous操作,所以它们工作方式不同,你不能像在基本的同步操作中那样分配值。 事实上,这是Node.js的主要观点。 你可以阅读更多,如果你按照下面的链接: https : //nodejs.org/about/

那么如何解决你所面临的问题。 我可以为您提供2种方式:

  • 使用callback
  • 使用承诺

callback

这其实是你现在使用的。 你需要运行基本function,并把另一个(callback)函数作为额外的参数,所以一旦准备就绪,callback函数将被触发,你将能够得到结果。 如何将结果接收到您的variables中:

 var searchQuery = {}; //or something specific like {name: 'Kitten Name'}; var foundKittens = []; Kitten.find(searchQuery , function (err, kittens) { if (err) { //do something with error } else { foundKittens = kittens } }); 

请注意,由于这些asynchronous操作的具体情况,您必须在现有callback中进行所有其他操作。 不久你就会遇到这个叫“Callback Hell”的问题。

有关callback和“回拨地狱”的更多信息,请阅读:

http://callbackhell.com/

承诺

这是使用asynchronous函数更容易理解和专业的方式。 mongooseODM支持承诺( http://mongoosejs.com/docs/api.html#promise_Promise ),所以你可以做到以下几点。

 var searchQuery = {}; //or something specific like {name: 'Kitten Name'}; var foundKittens = []; Kitten .find(searchQuery) .exec() .then(function(kittens){ //here you can assign result value to your variable //but this action is useless as you are working with results directly foundKittens = kittens; return kittens; }) .onReject(function(err){ throw err; //or something else }); 

那么你只是在现有的承诺之内工作,你可能会有越来越多的“然后”的陈述,如:

 Kitten .find(searchQuery) .exec() .then(function(kittens){ foundKittens = kittens; return kittens; }) .then(countKittents) .then(changeSomethingInKittents) .then(saveKittentsToDb) .onReject(function(err){ throw err; //or something else }); 

关于承诺的更多信息请阅读:

http://pouchdb.com/2015/05/18/we-have-a-problem-with-promises.html