mongoose、express 和 node.js 中回调函数的参数
Posted
技术标签:
【中文标题】mongoose、express 和 node.js 中回调函数的参数【英文标题】:Arguments to callback function in mongoose, express and node.js 【发布时间】:2013-02-22 08:30:34 【问题描述】:我遵循 MCV 方法来开发我的应用程序。遇到一个问题,不知道参数是怎么传给回调函数的。
animal.js(模型)
var mongoose = require('mongoose')
, Schema = mongoose.Schema
var animalSchema = new Schema( name: String, type: String );
animalSchema.statics =
list: function(cb)
this.find().exec(cb)
mongoose.model('Animal', animalSchema)
animals.js(控制器)
var mongoose = require('mongoose')
, Animal = mongoose.model('Animal')
exports.index = function(req, res)
Animal.list(function(err, animals)
if (err) return res.render('500')
console.log(animals)
我的问题来了:为什么模型中的“列表”可以只执行回调而不传递任何参数?错误和动物究竟是从哪里来的?
我想我可能会错过一些与 node.js 和 mongoose 中的回调相关的概念。如果您能提供一些解释或指出一些材料,非常感谢。
【问题讨论】:
【参考方案1】:函数列表想要传递一个回调函数。
所以你传递了一个回调函数。
this.find().exec(cb)
也想要一个回调函数,所以我们传递从 list
函数获得的回调。
execute
函数然后使用参数err
和它收到的对象(在本例中为animals
)调用回调(执行它)。
在列表函数内部发生了类似return callback(err, objects)
的事情,最终调用了回调函数。
你现在传递的回调函数有两个参数。这些是err
和animals
关键是:回调函数作为参数传递,但在被exec
调用之前永远不会被调用。该函数使用映射到err
和animals
的参数调用它
编辑:
由于不清楚,我将做一个简短的示例:
var exec = function (callback)
// Here happens a asynchronous query (not in this case, but a database would be)
var error = null;
var result = "I am an elephant from the database";
return callback(error, result);
;
var link = function (callback)
// Passing the callback to another function
exec(callback);
;
link(function (err, animals)
if (!err)
alert(animals);
);
可以在这里找到小提琴:http://jsfiddle.net/yJWmy/
【讨论】:
首先感谢您的回答。我理解你回答的第一部分。但我对第二部分感到困惑:列表函数从不声明一个名为“动物”的变量。它如何将从数据库接收到的对象映射到“动物”? 它不必知道对象的名称,它只需调用映射到function (err, animals)
的callback(err, objects)
。所以对象被映射到动物
也许你也错过了回调传递给列表函数,执行发生在列表函数内部,你看不到这里
我这样想是否正确?:当“animal.js”中的“list”函数运行这一行this.find().exec(cb)
,this.find()
返回两个变量“err”和“objects”和致电cb(err, objects)
。所以它映射到function(XXX, YYY)
,在这种情况下是函数(错误,动物)。
这引起了我的困惑,因为从猫鼬Mongoose exec API的API文档中,它没有提到err
和objects
是如何传递给回调函数的以上是关于mongoose、express 和 node.js 中回调函数的参数的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Express 和 NodeJS 中针对 Mongoose 错误进行错误处理。
通过 express、mongoose 和 angular 删除 mongo 文档时出现 404
Express + Mongoose + 聚合 + 计算可用库存
使用 Nodejs、Express、Mongoose 和 React 将图像上传到 MongoDB