Методы экземпляра, не определенные для результата запроса Mongoose findOne ()? - PullRequest
0 голосов
/ 29 июня 2018

Моя проблема в том, что я не могу вызвать метод экземпляра модели в документе, возвращенном из запроса findOne(), хотя я могу успешно вызвать метод экземпляра в том же документе, прежде чем сохранить его в коллекцию.

Сначала обычные require() с, а затем создание схемы:

var express = require('express');
var router = express.Router();
const mongoose = require('mongoose');
const pwHash = require('password-hash');
const dbAddress = 'mongodb://localhost/18-652_Ramp_Up_Project';
const projectDb = mongoose.createConnection(dbAddress);

const exampleUserSchema = new mongoose.Schema({
  username: String,
  password: String,
});

// Instance methods of the User class:
exampleUserSchema.methods.checkPw = function(pwToAuthenticate) {
  return pwHash.verify(pwToAuthenticate, this.password);
};

// Retrieve the document corresponding to the specified username.
exampleUserSchema.statics.findOneByUsername = function(username) {
  return new Promise((resolve, reject) => {
    projectDb.collection('exampleUsers').findOne(
      {username: username},
      (err, existingUser) => {
        if (err) throw(err);
        return resolve(existingUser ? existingUser : null);
      }
    );
  });
};

// Constructor (through mongo);
const ExampleUser = projectDb.model('ExampleUser', exampleUserSchema, 'exampleUsers');

Теперь интересная часть: я могу создать нового пользователя и успешно вызвать метод экземпляра:

// Create a test user and try out the 
const hashedPw = pwHash.generate('fakePassword');
ExampleUser.create({username: 'fakeUsername', password: hashedPw}, (err, newUser) => {
  console.log(newUser.checkPw('fakePassword')); // --> true
  console.log(newUser.checkPw('password123')); // --> false
  newUser.save((err) => {
    console.log('New user ' + newUser.username + ' saved.'); // --> New user fakeUsername saved.
  });
});

Но когда я пытаюсь вызвать его в документе, возвращенном из запроса findOne (), это "не функция":

/* POST user login info. */
router.post('/login', (req, res, next) => {

  // Try to look up the user in the database.
  ExampleUser.findOneByUsername(req.body.username) // Static method works.
      .then((existingUser) => {
        console.log(existingUser);
        if (existingUser && existingUser.checkPw(req.body.password)) { // Instance method doesn't.
          console.log('Access granted.');
        } else {
          console.log('Access denied.');
        }
      });
});

module.exports = router;

Это производит:

POST /example/login 200 22.587 ms - 14
{ _id: 5b3d592d8cd2ab9e27915380,
  username: 'fakeUsername',
  password: 'sha1$ea496f95$1$6a01df977cf204357444e263861041c622d816b6',
  __v: 0 }
(node:40491) UnhandledPromiseRejectionWarning: TypeError: existingUser.checkPw is not a function
    at ExampleUser.findOneByUsername.then (/Users/cameronhudson/Documents/GitHub/18-652_Ramp_Up_Project/routes/exampleUsers.js:52:42)
    at process._tickCallback (internal/process/next_tick.js:68:7)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...