Мангуста функция findOne не работает с аутентификацией - PullRequest
0 голосов
/ 26 апреля 2018

Я работаю над моделью здесь:

// user.js
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var bcrypt = require('bcrypt');

// Define collection and schema for Users
let User = new Schema(
  {
    firstName: String,
    lastName: String,
    emailaddress: String,
    password: String,
  },
  {
    collection: 'users'
  }
);

// authenticate input against database documents
User.statics.authenticate = ((emailaddress, password, callback) => {
  User.findOne({ emailaddress: emailaddress })
      .exec(function(error, user){
        if(error){
          return callback(error)
        } else if (!user){
          console.log('User not found!');
        }
        bycrypt.compare(password, user.password, function(err, result){
          if(result === true){
            return callback(null, user);
          } else {
            return callback();
          }
        })
      })
});

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

Как вы можете видеть на моей модели, я включил User.statics.authenticate в мои коды, чтобы выполнить некоторую аутентификацию. А затем в моем файле маршрута login.js:

const path = require('path');
const express = require('express');
const router = express.Router();
const db = require('../../database/index');
const axios = require('axios');
const User = require('../../database/models/user');

router.get('/', (req, res) => {
  console.log('hi there this is working login get');
});

router.post('/', (req, res) => {
  var emailaddress = req.body.emailaddress;
  var password = req.body.password;


  if( emailaddress && password ){
    User.authenticate(emailaddress, password, function(err, user){
       if(err || !user){
         console.log('Wrong email or password!');
       } else {
         req.session.userId = user._id;
         return res.redirect('/');
       }
    });
  } else {
     console.log('both fields are required...');
  }

});

module.exports = router;

Я вызвал функцию, а затем User.authenticate функцию, а также создал маршрут для root с / к - это пример, который я хочу защитить и перенаправить пользователю после входа в систему:

router.get('/', (req, res) => {
  if(! req.session.userId ){
    console.log('You are not authorized to view this page!');
  }

  User.findById(req.session.userId)
      .exect((err, user) => {
        if(err){
          console.log(err)
        } else {
          res.redirect('/');
        }
      })
});

После нажатия на кнопку отправить в моей форме реагирования возвращается эта ошибка:

TypeError: User.findOne is not a function
    at Function.User.statics.authenticate (/Users/mac/Documents/monkeys/database/models/user.js:35:8)

Я проверил документацию Mongoose и, похоже, я использую правильный синтаксис. Любая идея, что я здесь не так делаю? Пожалуйста помоги! Извините, супер новичок здесь!

PS. Я уже установил и настроил базовую экспресс-сессию.

ОБНОВЛЕНИЕ:

Я удаляю функцию стрелки из моего вызова и использую this.model.findOne, но все равно получаю опечатку findOne не является функцией

// authenticate input against database documents
User.statics.authenticate = function(emailaddress, password, callback){
  this.model.findOne({ emailaddress: emailaddress })
      .exec(function(error, user){
        if(error){
          return callback(error)
        } else if (!user){
          console.log('User not found!');
        }
        bycrypt.compare(password, user.password, function(err, result){
          if(result === true){
            return callback(null, user);
          } else {
            return callback();
          }
        })
      })
};

1 Ответ

0 голосов
/ 26 апреля 2018

findOne - это метод вашей пользовательской модели, а не экземпляр вашей пользовательской модели.Он предоставляет свои асинхронные результаты вызывающей стороне с помощью обратного вызова:

User.findOne({field:'value'}, function(err, doc) { ... });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...