Mongoose удалил некоторые данные из модели.найдите и смоделируйте.Ответ findOne

#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 . 🙂