mongoose findById с использованием асинхронного ожидания - PullRequest
0 голосов
/ 10 сентября 2018

Я пытаюсь обновить коллекцию, используя async / await. Ниже мой код:

const mongoose = require('mongoose');

mongoose.connect('mongodb://localhost:27017/mongo-exercises')
    .then(() => {
        console.log('Connected to MongoDB');
        UpdateCourse("5a68fdd7bee8ea64649c2777");
    })
    .catch(error => console.error('Could not connect to MongoDB : ' + error));

    const courseSchema = mongoose.Schema({
        name: String,
        author: String,
        tags: [String],
        date: Date,
        isPublished: Boolean,
        price: Number
    });

const Course = mongoose.model('course', courseSchema);
async function UpdateCourse(id) {
    console.log(`Inside Update Course. Finding ${id}`);
    const course = await Course.findById(id);
    console.log(`Course: ${course}`);
    if(!course)
        return;
    
    course.isPublished = true;
    course.author = 'Another Author';
    //course.set({isPublished: true, author: 'Another Author'});
    const saved = await course.save();    
    console.log(saved);
}

Я запрашиваю коллекцию в оболочке mongo, которая выдает следующий вывод:

enter image description here В методе UpdateCourse () я получаю нулевое значение для курса. У меня есть идентификатор в коллекции. Может кто-нибудь сказать мне, почему я получаю эту ошибку при использовании async / await.

Я пытался изменить findById() -> findOne({_id: id}). Та же ошибка. Я попытался изменить findById() -> find({_id: id}) здесь я получаю UnhandledPromiseRejectionWarning: Unhandled promise rejection.. Не понимаю почему.

enter image description here

1 Ответ

0 голосов
/ 10 сентября 2018

Значение _id в документе, который вы пытаетесь найти, является String, а не ObjectId.Поэтому вам нужно обновить схему, чтобы определить _id как String;в противном случае Mongoose применит любые значения _id в ваших запросах к типу _id по умолчанию ObjectId (в результате запрос не будет соответствовать документу).

const courseSchema = mongoose.Schema({
    _id: String,
    name: String,
    author: String,
    tags: [String],
    date: Date,
    isPublished: Boolean,
    price: Number
});

Сказав все это, вы, вероятно, захотите обновить свои документы доиспользуйте значения ObjectId для _id вместо String, поскольку это более эффективно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...