Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 是否未为Mongoose findOne()查询结果定义实例方法?_Node.js_Mongodb_Mongoose - Fatal编程技术网

Node.js 是否未为Mongoose findOne()查询结果定义实例方法?

Node.js 是否未为Mongoose findOne()查询结果定义实例方法?,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我的问题是,我无法对从findOne()查询返回的文档调用模型实例方法,即使我可以在保存到集合之前成功地对同一文档调用实例方法 首先是通常的require()s,然后是架构创建: var express = require('express'); var router = express.Router(); const mongoose = require('mongoose'); const pwHash = require('password-hash'); const dbAddress

我的问题是,我无法对从
findOne()
查询返回的文档调用模型实例方法,即使我可以在保存到集合之前成功地对同一文档调用实例方法

首先是通常的
require()
s,然后是架构创建:

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 /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)

@JohnnyHK可能被复制虽然该线程与此线程有相似之处,但它的问题是由从http请求调用非文档对象的实例方法引起的。在我的例子中,我无法对findOne()查询返回的文档对象调用实例方法。从
findOne
查询返回的肯定是模型实例。您的
userSchema.methods.checkPw=function…
行是否在调用
mongoose.model
创建
用户
模型之前或之后出现。是。我将包含一点我的模式来说明这一点。这是一段相当多的代码,它并不完整。可以提供一个新的解决方案吗?
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)