Статическая функция Mongoose, использующая .find (), возвращает запрос, а статическая функция не распознается

поэтому я объявил схему и предоставил ей статическую функцию, которая ищет пользователя по электронной почте в файле ниже:

./database.js

const mongoose = require('mongoose')
mongoose.connect('mongodb://localhost/investDB', { useNewUrlParser: true })

const Schema = mongoose.Schema

var UserSchema = new Schema({
  email: String,
  username: String,
  password: String,
  firstName: String,
  lastName: String
})

UserSchema.statics.findByEmail = function (email) {
      return this.find({email: email })
}

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

и вызывается другим файлом

./fonctions.js

var mongooseModel = require('./database')

function loginAlreadyExist(emailInput) {
  var onDataBase = new mongooseModel()
  return onDataBase.findByEmail(emailInput)
}

exports.loginAlreadyExist = loginAlreadyExist

после использования статической функции я получаю следующую ошибку

onDataBase.findByEmail is not a function

после этого я решил в первую очередь посмотреть, что возвращает findByEmail, поэтому я добавил console.info(User.findByEmail("a@a")) непосредственно перед экспортом файла ./database.js.

в то время как я ожидаю вывода, аналогичного определенной схеме, я получаю запрос, который не содержит никакой информации, даже если почта существует

Query {
  _mongooseOptions: {},
  _transforms: [],
  mongooseCollection: 
   NativeCollection {
     collection: null,
     opts: 
      { bufferCommands: true,
        capped: false,
        '$wasForceClosed': undefined },
     name: 'users',
     collectionName: 'users',
     conn: 
      NativeConnection {
        base: [Object],

....
options: {},
  _conditions: { email: 'a@a' },
  _fields: undefined,
  _update: undefined,
  _path: undefined,
  _distinct: undefined,
  _collection: 
   NodeCollection {
     collection: 
      ....
     collectionName: 'users' },
  _traceFunction: undefined,
  '$useProjection': true }

так что перед ней 2 проблемы,

1) почему статическая функция не распознается 2) почему вывод findByEmail не соответствует схеме (или коллекции, структурированной в mongodb)

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
0
807
2

Ответы 2

Отсутствует скоба:

UserSchema.statics.findByEmail = function (email) {
    return this.find({email: email })
}

Также вы получаете результат запроса в функции обратного вызова на find ():

UserSchema.statics.findByEmail = function (email) {
    let data;
    this.find({email: email }, function (err, result) {
        if (err) throw err;
        data = result;
    }
    return data;
}

моя проблема, это была ошибка копирования, я исправил ее, но это не было источником моей проблемы, потому что в противном случае у меня было бы другое сообщение об ошибке. но вы правы, моя ошибка в том, что я не обращаю внимания на прошлую копию

El.K Ibrahim 09.11.2018 10:38

@ El.KIbrahim Я отредактировал свой ответ, вы можете получить результат поиска в функции обратного вызова.

Corentin Bernard 09.11.2018 10:49

Я вижу, что вы там делали, но, по-видимому, данные переменных не обновляются при вызове в обратном вызове, плюс то, что я не отменяю, является результатом, если сам не откуда пришел запрос, обычно возвращаемый результат должен быть Массив, соответствующий схеме, определенной ранее. Я также думаю, что обратный вызов не нужен, я просто попробую его поймать, но для простоты я просто вернулся

El.K Ibrahim 09.11.2018 11:06

В вашей модели

UserSchema.statics.findByEmail = function (email) {
    return new Promise((resolve, reject) => {
        return this.findOne({ email: email }).exec(function (err, user) {
            if (err) reject(err)
            resolve(user);
        });
    });
}

Другие вопросы по теме