这个回调调用如何在Node.js中使用mongo .find调用

时间:2016-06-10 23:10:04

标签: javascript node.js mongodb

models / category.js

var mongoose = require('mongoose');

// Category Schema
var categorySchema = mongoose.Schema({
  title: {
    type: String
  },
  description: {
    type: String
  },
  created_at: {
    type: Date,
    default: Date.now
  }
});

var Category = module.exports = mongoose.model('Category', categorySchema);

// Get Categories
module.exports.getCategories = function(callback, limit) {
  Category.find(callback).limit(limit).sort([['title', 'ascending']]);
}

路由/ categories.js

var express = require('express');
var router = express.Router();

Category = require('../models/category.js');

router.get('/', function(req, res, next) {
  Category.getCategories(function(err, categories) {
    if (err) res.send(err);
    res.render('categories', 
      { 
        title: 'Categories',
        categories: categories
      });
  });
});

router.post('/add', function(req,res) {
  res.send('Form Submitted');
});

module.exports = router;

我对此代码提出了一些问题

a)当我们将该回调函数传递给Category.find(回调)中的models / category.js时,回调机制如何从routes / categories.js起作用。这对我来说似乎很奇怪,因为我们正在做一个完整的res.render,它成为Category.find()的一部分?

b)指定的限制在哪里?

c)为什么在Category = require前面没有var(' ../ models / category.js');

1 个答案:

答案 0 :(得分:0)

a)确实发生了什么,并且是好的:res.render在数据库上执行find()操作之前不会被调用,并且会返回结果以便猫鼬代码返回给你。你希望在之后运行回调函数,你得到了查询的结果,所以之前调用res.render会更奇怪。

b)在文档中。 http://mongoosejs.com/docs/api.html#model_Model.find生成一个Query对象,该对象可能是同步(即在实际上使查询在数据库中解析之前),使用wherelimit进一步指定,等

c)因为有人懒惰。在这个例子中,它实际上没有什么区别,因为没有var(或现代JS中的constlet),变量声明被添加到本地上下文中,在您的文件中routes/categories.js模块上下文,并且因为Categories被声明在该范围的顶部,var不会更改变量最终被绑定的位置。但它是懒惰的,并且对于良好的示例代码,应该在它前面有var