【问题标题】:Node.js > 'findOne' of undefined < LocalStrategy from PassportNode.js > 'findOne' of undefined < LocalStrategy from Passport
【发布时间】:2019-05-17 23:19:07
【问题描述】:

我使用 Passport 创建登录。

但是,我得到:

TypeError: 无法读取未定义的属性“findOne”

尝试登录时。

经过调试,确认localStrategy.js异步后用户未定义。

我认为所有的动作都很完美,但是我的代码有问题。

我能告诉你我哪里出错了吗?

passport/index.js

const local = require('./localStrategy');
const { User } = require('../model/user');

module.exports = (passport) => {
  passport.serializeUser((user, done) => {
    done(null, user._id);
  });

  passport.deserializeUser((id, done) => {
    User.findOne({ id: id })
      .then((user) => done(null, user))
      .catch((err) => done(err));
  });

  local(passport);
};

passport/localStrategy.js

const LocalStrategy = require('passport-local').Strategy;
const { User } = require('../model/user');

module.exports = (passport) => {
  passport.use(
    new LocalStrategy(
      {
        usernameField: 'email',
        passwordField: 'password'
      },
      async (email, password, done) => {
        try {
          const exUser = await User.findOne({ email: email });
          if (exUser) {
            const result = await bcrypt.compare(password, exUser.password);
            if (result) {
              done(null, exUser);
            } else {
              done(null, false, { message: 'failed.' });
            }
          } else {
            done(null, false, { message: 'failed.' });
          }
        } catch (err) {
          console.error(err);
          done(err);
        }
      }
    )
  );
};

routes/user.js

const express = require('express');
const router = express.Router();

const { isLoggedIn, isNotLoggedIn } = require('./middleware');

const usersController = require('../controller/users_controller');

router.get('/login', isNotLoggedIn, usersController.user_login);

controller/users_controller.js

const User = require('../model/user');
const bcrypt = require('bcrypt');
const passport = require('passport');

exports.user_login = (req, res, next) => {
  passport.authenticate('local', (authError, user, info) => {
    if (authError) {
      console.error(authError);
      return next(authError);
    }
    if (!user) {
      return res.send("not user.")
    }
    return req.login(user, (loginError) => {
      if (loginError) {
        console.error(loginError);
        return next(loginError);
      }
      return res.send("login successfully")
    });
  })(req, res, next);
};

model/user.js

const mongoose = require('mongoose');

let UserSchema = new mongoose.Schema({
  email: {
    type: String,
    required: true,
    unique: true
  },
  password: {
    type: String,
    require: true
  },
  createAt: {
    type: Date,
    default: Date.now
  }
});

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

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:
    const { User } = require('../model/user');
    

    此代码返回User = undefined

    你能在'../model/user'中显示代码吗?

    您是否通过以下方式导出:

    module.exports = {
        User: your_user
    }
    

    ?

    如果你使用:

    module.exports = User;
    

    你应该打电话

    const User = require('../model/user');
    

    代替:

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

    或者您可以在“../model/user”中更改导出:

    module.exports = {
        User: your_user
    }
    

    【讨论】:

    • 我在文章中添加了“model/user.js”。我写了需要需要的所有内容。我认为还有另一个问题。
    • @COLEAN 用户 User 而不是 { User }
    【解决方案2】:

    在您的查询中应该是 _id 而不是 id 护照/index.js

     User.findOne({ _id: id })
          .then((user) => done(null, user))
          .catch((err) => done(err));
      });
    

    在passport/localStrategy文件中正确导入模型

    const User = require('../model/user');
    
    

    【讨论】:

      猜你喜欢
      • 2019-07-31
      • 1970-01-01
      • 2022-12-04
      • 1970-01-01
      • 1970-01-01
      • 2022-12-02
      • 2023-02-25
      • 2016-08-19
      • 1970-01-01
      相关资源
      最近更新 更多