2016-06-10 6 views
0

Modelle .find rufen/category.jsWie funktioniert das Callback-Anruf in Node.js mit Mongo

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']]); 
} 

Routen/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; 

habe ich ein paar Fragen zu diesem Code

a) Wie funktioniert der Callback-Mechanismus von routes/categories.js, wenn wir diese Callback-Funktion übergeben? models/category.js in Category.find (Rückruf). Das erscheint mir bizarr, da wir einen ganzen res.render machen, der Teil von Category.find() wird?

b) Wo ist die Grenze angegeben?

c) Warum ist var nicht vor Kategorie = require ('../ models/category.js');

+0

a) es ist nur javascript, .find Prüft Art von Parameter und gibt alle zurück, wenn es keine Abfrage gibt. b) Limit ist in Ihrem Fall nicht definiert. c) Auch es ist Javascript, es wird Modulebene Variable in Nodejs sein – YOU

Antwort

0

a) das ist in der Tat, was passiert, und ist gut: res.render wird erst der find() Vorgang in der Datenbank ausgeführt wird aufgerufen und das Ergebnis wird wieder für den Mungo-Code gesendet an Dich zurück. Sie möchten die Callback-Funktion nach ausführen Sie erhalten das Ergebnis für Ihre Abfrage, und so Calling res.render vorher wäre viel bizarrer.

b) in der Dokumentation. http://mongoosejs.com/docs/api.html#model_Model.find ergibt sich ein Abfrageobjekt, das synchron (das heißt, bevor die Abfrage tatsächlich an der Datenbank zu lösen) sein kann, mit where, limit usw.

c) weiter spezifiziert, weil jemand faul bekam. In diesem Beispiel macht das keinen Unterschied, denn ohne var (oder const oder let im modernen JS) wird eine Variablendeklaration an den lokalen Kontext geheftet, der in Ihrer Datei der Modulkontext routes/categories.js ist, und weil Categories bei der Deklaration deklariert ist Oben in diesem Bereich ändert sich var nicht, wo die Variable gebunden wird. Aber es ist faul, und für guten Beispiel-Code, der solltevar davor haben.

Verwandte Themen