Node.js Mongoose静态函数没有被调用

最近我一直试图重写我的node.js表示应用程序更符合mvc原则。 我也一直在尝试joinmongoose。 我在调用mongoose模型的静态函数时遇到问题。

userSchema.statics.findDuplicates = function (cb) { console.log("Duplicates called"); this.findOne({ email: this.email }, function(err, result){ if (err) throw err; if (result) { cb("A user with this email has already been created."); } else { cb(""); } }); } 

现在的问题是我以后使用这个模式导出一个模型,所以这个包含在一个文件中:

 module.exports = mongoose.model('User', userSchema); 

当我稍后在控制器内部调用这个(显然需要并预先启动模型):

 user.findDuplicates(function(result){ if (result) { res.send("Selle e-mailiga kasutaja on juba loodud."); console.log("Duplicates"); } else { user.save(); res.send("Kasutaja loodud."); console.log("User created with password.") } }); 

它永远不会被调用。 节点告诉我它接受了一个post,但得到了一个500内部服务器错误,并且在控制台中没有出现findDuplicates中的“Duplicates called”。 这里有些错误,我不知道如何解决。

编辑 :完整的控制器代码:

 var express = require('express'); var router = express.Router(); var User = require("../models/user.js"); router.get('/', function(req, res, next) { res.render('users',{title: "Lisa kasutaja"}); }); router.post('/', function(req, res, next) { var query = req.body; var message = ""; console.log("Post recieved " + JSON.stringify(query)); if (query.password != query.repeatPassword){ res.send("Paroolid ei ole võrdsed."); console.log("Passwords don't match"); } else { var user = new User({ firstName: query.firstName, lastName: query.lastName, telephone: query.telephone, email: query.email, password: query.password }); console.log("User created"); user.findDuplicates(function(result){ if (result) { res.send("Selle e-mailiga kasutaja on juba loodud."); console.log("Duplicates"); } else { user.save(); res.send("Kasutaja loodud."); console.log("User created with password.") } }); } }); module.exports = router; 

您的问题在于您在模型的实例中调用静态方法,这是不正确的。 看到下面的区别:

 // if you define a static method userSchema.statics.findDuplicates = function (cb) { // do your stuff } // you call it this way var User = require("../models/user.js"); User.findDuplicates(function (result) { // do your stuff }); // if you define an instance method userSchema.methods.findDuplicates = function (cb) { // do your stuff }; // you call it this way (on an instance of your model) var User = require("../models/user.js"); var user = new User({ firstName: query.firstName, lastName: query.lastName, telephone: query.telephone, email: query.email, password: query.password }); user.findDuplicates(function (result) { // do your stuff });