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) 的事情,最终调用了回调函数。

你现在传递的回调函数有两个参数。这些是erranimals

关键是:回调函数作为参数传递,但在被exec 调用之前永远不会被调用。该函数使用映射到erranimals 的参数调用它

编辑:

由于不清楚,我将做一个简短的示例:

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文档中,它没有提到errobjects是如何传递给回调函数的

以上是关于mongoose、express 和 node.js 中回调函数的参数的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Express 和 NodeJS 中针对 Mongoose 错误进行错误处理。

通过 express、mongoose 和 angular 删除 mongo 文档时出现 404

Express + Mongoose + 聚合 + 计算可用库存

使用 Nodejs、Express、Mongoose 和 React 将图像上传到 MongoDB

mongoose、express 和 node.js 中回调函数的参数

如何使用 Mongoose、Express、Angular 4 和 NodeJS 上传/保存和显示图片