поэтому я объявил схему и предоставил ей статическую функцию, которая ищет пользователя по электронной почте в файле ниже:
./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)



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Отсутствует скоба:
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.KIbrahim Я отредактировал свой ответ, вы можете получить результат поиска в функции обратного вызова.
Я вижу, что вы там делали, но, по-видимому, данные переменных не обновляются при вызове в обратном вызове, плюс то, что я не отменяю, является результатом, если сам не откуда пришел запрос, обычно возвращаемый результат должен быть Массив, соответствующий схеме, определенной ранее. Я также думаю, что обратный вызов не нужен, я просто попробую его поймать, но для простоты я просто вернулся
В вашей модели
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);
});
});
}
моя проблема, это была ошибка копирования, я исправил ее, но это не было источником моей проблемы, потому что в противном случае у меня было бы другое сообщение об ошибке. но вы правы, моя ошибка в том, что я не обращаю внимания на прошлую копию