为什么我不能访问mongoose模式的方法?

我有一个Nodejs应用程序中的这个Mongoose模式:

const mongoose = require('mongoose'), Schema = mongoose.Schema, sodium = require('sodium').api; const UserSchema = new Schema({ username: { type: String, required: true, index: { unique: true } }, salt: { type: String, required: false }, password: { type: String, required: true } }); UserSchema.methods.comparePassword = function(candidatePassword, targetUser) { let saltedCandidate = candidatePassword + targetUser.salt; if (sodium.crypto_pwhash_str_verify(saltedCandidate, targetUser.password)) { return true; }; return false; }; module.exports = mongoose.model('User', UserSchema); 

我创build了这个路线文件。

 const _ = require('lodash'); const User = require('../models/user.js'); // yes, this is the correct location module.exports = function(app) { app.post('/user/isvalid', function(req, res) { User.find({ username: req.body.username }, function(err, user) { if (err) { res.json({ info: 'that user name or password is invalid. Maybe both.' }); }; if (user) { if (User.comparePassword(req.body.password, user)) { // user login res.json({ info: 'login successful' }); }; // login fail res.json({ info: 'that user name or password is invalid Maybe both.' }); } else { res.json({ info: 'that user name or password is invalid. Maybe both.' }); }; }); }); }; 

然后,我使用Postman使用适当的Body内容调用127.0.0.1:3001/user/isvalid 。 terminal说告诉我TypeError: User.comparePassword is not a function ,崩溃的应用程序。

由于if (user)位通过,这表明我已经正确地从Mongo中检索了一个文档,并且有一个User模式的实例。 为什么该方法无效?

eta:模块导出我原来没有复制/粘贴

这创build实例方法:

 UserSchema.methods.comparePassword = function(candidatePassword, targetUser) { // ... }; 

如果你想要一个静态方法使用这个:

 UserSchema.statics.comparePassword = function(candidatePassword, targetUser) { // ... }; 

静态方法是当你想调用它作为User.comparePassword()

实例方法是当你想调用它作为someUser.comparePassword() (在这种情况下,会有很大的意义,所以你不必显式传递用户实例)。

请参阅文档: