#node.js #mongodb #mongoose
#node.js #mongodb #mongoose
Вопрос:
Я создаю приложение Express / Node и пытаюсь создать контроллер входа в систему. Когда запрос поступает в / login, я могу найти данные пользователя в моей коллекции Mongo с помощью Mongoose’ model.findOne, но проблема в том, что функция возвращает не все, что есть в документе 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.log(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 {
}
});
Я получаю сообщение об ошибке: не удается прочитать свойство «пароль не определен.
И это ответ, который находится в «документе» :
{
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» для поиска в первую очередь.
Комментарии:
1. Не могли бы вы показать свою схему mongoose. Кажется, что это поле не существует в модели.
2. @AnthonyWinzlet Схема над полем действительно существует. Это то, что я искал с помощью: ie: «account.username»
3. Упс, я на мобильном телефоне. Пропустил эту часть на маленьком экране.
Ответ №1:
Схема вашей учетной записи неверна. Для вложенных объектов это должно быть так.
acount:{
username: {type:String},
password: {type:String},
}
Теперь это будет считаться объектом со свойствами username и password
Комментарии:
1. имя пользователя: строка будет работать. Проблема в том, что ваша схема определяет acount:{type:String}. Это должен быть объект. Или массив объектов. Чтобы у него могли быть свойства username и password
2. Как это
compliance: { type: String, value: String }
работает?3. или вы можете удалить type:String из объекта account
4. Потому что это строка, а string может иметь значение 🙂
5. ваш объект contact похож на объект account . 🙂