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');
答案 0 :(得分:0)
a)确实发生了什么,并且是好的:res.render
在数据库上执行find()
操作之前不会被调用,并且会返回结果以便猫鼬代码返回给你。你希望在之后运行回调函数,你得到了查询的结果,所以之前调用res.render
会更奇怪。
b)在文档中。 http://mongoosejs.com/docs/api.html#model_Model.find生成一个Query对象,该对象可能是同步(即在实际上使查询在数据库中解析之前),使用where
,limit
进一步指定,等
var
(或现代JS中的const
或let
),变量声明被添加到本地上下文中,在您的文件中routes/categories.js
模块上下文,并且因为Categories
被声明在该范围的顶部,var
不会更改变量最终被绑定的位置。但它是懒惰的,并且对于良好的示例代码,应该在它前面有var
。