User.findOne()不是函数

时间:2017-01-29 19:21:31

标签: javascript node.js

passport.use('local-signup', new LocalStrategy({
    // by default, local strategy uses username and password, we will override with email
    usernameField : 'email',
    passwordField : 'password',
    passReqToCallback : true // allows us to pass back the entire request to the callback
},
(req, email, password, done) => {
    // asynchronous
    // User.findOne wont fire unless data is sent back
    process.nextTick(() => {

    // find a user whose email is the same as the forms email
    // we are checking to see if the user trying to login already exists
    User.findOne({ 'email' :  email },function(err, user){
        // if there are any errors, return the error

        if (err)
            return done(err);

        // check to see if theres already a user with that email
        if (user) {
            return done(null, false, {'errorMessages': 'That email is already taken.'});
        } else {

            // if there is no user with that email
            // create the user
            let newUser            = new User();

            // set the user's local credentials
            newUser.name       = req.body.fullname;
            //newUser.email          = email;
            newUser.password       = newUser.generateHash(password);


            // save the user
            newUser.save((err)=>{
                if (err)
                    return done(err);
                return done(null, newUser);
            });
        }
    });    
    });
}));

上面的代码在使用护照js身份验证的节点js中,并且local-signup的代码不起作用。

在上面的代码中我收到错误:

User.findOne() is not a function

我的架构没问题......请帮忙

10 个答案:

答案 0 :(得分:4)

您需要(如果您还没有)使用model

创建数据实例
var UserDetails = mongoose.model('userInfo', UserDetail);

现在你应该可以在这里使用.findOne

确保您在类似的集合中定义日期的结构。

 var Schema = mongoose.Schema;
 var UserDetail = new Schema({
  username: String,
  password: String
}, {
  collection: 'userInfo'
});

答案 1 :(得分:1)

请使用下面的代码

module.exports = User = mongoose.model('user', UserSchema)

用户应为模型名称,并记得在顶部定义const UserSchema = new Schema以便在MongoDB和

中创建新模型

用户应该在拥有

的路线上
router.post('/user') (req, res) => { code here }

与此相关,您正在将猫鼬模式导出到路由用户,这使findOne被视为猫鼬功能。

答案 2 :(得分:1)

  1. User.findOne 不是函数错误

    就我而言:

  2. 正确的语法: const User = require('../../models/User') // 修正

  3. 由于 VS 代码自动格式化我的导入更改为下面而发生错误

    const User = require - '../../models/User' :- 虽然这个导入是罪魁祸首,但 VS 代码仍然验证了这个导入!

答案 3 :(得分:1)

你可以试试这个:

user.collection.findOne(...)

答案 4 :(得分:0)

也许您没有从用户模型文件夹中导出模型。 例如: module.exports =用户= mongoose.model(“ users”,UserSchema);

答案 5 :(得分:0)

从名为user.js的文件的models目录中导出用户Model。

module.exports.User = User

然后从任何其他方式加载用户模型

const {User} = require('../models/user.js');

注意:我假设用户模型文件名为 user.js

答案 6 :(得分:0)

使用

module.exports = User = mongoose.model("users", UserSchema);

代替

module.exports = User => mongoose.model("users", UserSchema);

答案 7 :(得分:0)

这是导出和导入模型的方式。如果将模型定义为const User = mongoose.model("users", UserSchema);,则通过export default User;导出模型。您应该使用以下内容导入该文件:

import User from '../db/models/user';

代替

const User = require('../db/models/user');

答案 8 :(得分:-1)

我也有这种情况,

const User = require('../../mongoose/User');
User.findOne(...);

返回“ findOne不是函数”

但是通过更改为:

var User = require('../../mongoose/User');
User.findOne(...);

..它有效。 希望我能帮助一个人!

答案 9 :(得分:-2)

在我的情况下,我这样定义用户↓

const User = '../../models/User'

而不是↓

const User = require('../../models/User')