Я создаю приложение Express/Node и пытаюсь создать контроллер входа в систему. Когда запрос поступает в /login, я могу найти информацию о пользователе в моей коллекции Mongo с помощью model.findOne Mongoose, но проблема в том, что функция возвращает не все, что есть в документе mongo.
Запрос данных через Robo 3T возвращает всю информацию
Вот моя модель
{
firstname: String,
surname: String,
fullname: String,
firthDate: Date,
identityType: String,
identityNumber: String,
address: {
residential: Object,
business: Object
},
contact: {
email: String,
cellphone: String,
home: String,
business: String,
fax: String
},
compliance: {
type: String,
value: String
},
account: {
type: String,
username: String,
password: String,
masala: String
},
created: Date,
updated: Date
}
Вот мой контроллер:
user.findOne({"account.username": username}, (err, doc) => {
if (!err) {
// found user. Compare passwords and return JWT;
console.info(doc);
bcrypt.compare(password, doc.account.password, (err, isValid) => {
// I get an error here : Cannot read property password of undefined.
if (!err) {
if (isValid) {
// generate jwt and send back to user;
}
} else {
// invalid password provided;
}
});
} else {
}
});
Я получаю сообщение об ошибке: Невозможно прочитать свойство "пароль неопределенного. И это ответ, который находится в «doc»:
{
firstname: "hello",
surname: "world",
fullname: "hello world",
firthDate: "01 January 1970",
identityType: "idnumber",
identityNumber: "12345",
address: {
residential: {},
business: {}
},
contact: {
email: "",
cellphone: "",
home: "",
business: "",
fax: ""
},
compliance: {
type: "",
value: ""
}
}
Похоже, что данные "doc.account" не возвращаются как часть ответа от функции findOne. Я не знаю, почему, потому что я использую данные в «doc.account» для поиска в первую очередь.
@AnthonyWinzlet Схема выше Поле существует. Это то, что я искал: например: "account.username"
Ой, я с мобильного. Пропустил эту часть на маленьком экране.
Схема вашей учетной записи неверна. Для вложенных объектов это должно быть так.
acount:{
username: {type:String},
password: {type:String},
}
Теперь это будет считаться объектом со свойствами имени пользователя и пароля.
имя пользователя: строка будет работать. Проблема в том, что ваша схема определяет учетную запись: {type: String}. Это должен быть объект. Или массив объектов. Так что он может иметь свойства имя пользователя и пароль
Почему compliance: { type: String, value: String }
работает?
или вы можете удалить тип: строка из объекта учетной записи
Потому что это строка, а строка может иметь значение :)
ваш контактный объект аналогичен объекту учетной записи. :)
Я использовал свойство «тип», забыв, что это зарезервированное ключевое слово. Я хотел, чтобы «тип» был типом учетной записи, таким как «пользователь», «администратор», «мод» и т. д. Я изменил свойство «тип» на «acc_type». Данные возвращаются, как и ожидалось.
Не могли бы вы показать свою схему мангуста. Кажется, что поля в модели не существует.