Как назначить массив объектов в мангусте - PullRequest
0 голосов
/ 10 февраля 2020

Я тестирую заполнение исправлений в пн goose.

const mongoose = require('mongoose')
const { ObjectId } = require('mongodb');
const app = require('express')()

mongoose.connect('<connection fine>', { useNewUrlParser: true, useUnifiedTopology: true })
mongoose.connection.once('open', function () {
    console.log('Connection with database')
});
const CompanySchema = new mongoose.Schema({
    name: String,
    address: String,
    employees: { type: mongoose.Schema.Types.ObjectId, ref: 'employee' }
})

const DepartmentSchema = new mongoose.Schema({
    name: String,
    location: String
})

const EmployeeSchema = new mongoose.Schema({
    firstName: String,
    lastName: String,
    mobile: String,
    department: { type: mongoose.Schema.Types.ObjectId, ref: 'department' }
})

let Department = mongoose.model('department', DepartmentSchema)
let Employee = mongoose.model('employee', EmployeeSchema)
let Company = mongoose.model('company', CompanySchema)

app.use("/", async (req, res) => {
    await Department.deleteMany({})
    await Employee.deleteMany({})
    await Company.deleteMany({})
    await Department.create({
        name: 'IT Department',
        location: 'Building A'
    })
    await Department.create({
        name: 'Marketing Department',
        location: 'Building B'
    })
    await Employee.create({
        firstName: 'Manel',
        lastName: 'Jakin',
        mobile: '986374763',
        department: await Department.findOne({ name: 'IT Department' })
    })
    await Employee.create({
        firstName: 'Laurel',
        lastName: 'Borbas',
        mobile: '967583566',
        department: await Department.findOne({ name: 'Marketing Department' })
    })

    await Company.create({
        name: 'MagoDev',
        address: 'Algarve',
        employees: await Employee.find().select('_id') // or await Employee.find()
    })

    res.json({
        //departments: await Department.find(),
        //employees: await Employee.find().populate('department'),
        company: await Company.find().populate({
            path: 'employee',
            model: 'employee',
            populate: { path: 'department', model: 'department' }
        })
    })
})

app.listen(5000, () => console.log("Server on port 5000"))

, и я получил эту ошибку

Сервер на порту 5000 Соединение с базой данных (узел: 42988) UnhandledPromiseRejectionWarning : ValidationError: сбой проверки компании: сотрудники: сбой приведения к ObjectID для значения "[{_id: 5e408062eaef2ca7ec5c2d35}, {_id: 5e408063eaef2ca7ec5c2d36}]" в пути "employee" на новой ошибке ValidationError (C: \ Users \ media \ Documents Проекты \ Mon goose -популяция \ node_modules \ mongoose \ lib \ error \ validation. js: 31: 11) в модели.Document.invalidate (C: \ Users \ media \ Documents \ Projects \ Mon goose -population \ node_modules \ mongoose \ lib \ document. js: 2490: 32) в модели. $ set (C: \ Users \ media \ Documents \ Projects \ Mon goose -population \ node_modules \ mongoose \ lib \ document. js: 1200: 12) в model._handleIndex (C: \ Users \ media \ Documents \ Projects \ Mon goose -population \ node_modules \ mongoose \ lib \ document. js: 935 : 14) в модели. $ Set (C: \ Users \ media \ Documents \ Projects \ Mon goose -po pulation \ node_modules \ mongoose \ lib \ document. js: 879: 22) в модели. Документ (C: \ Users \ media \ Documents \ Projects \ Mon goose -популяция \ node_modules \ mongoose \ lib \ document . js: 137: 12) в модели. Модель (C: \ Users \ media \ Documents \ Projects \ Mon goose -population \ node_modules \ mongoose \ lib \ model. js: 102: 12) в новой модели (C: \ Users \ media \ Documents \ Projects \ Mon goose -population \ node_modules \ mongoose \ lib \ model. js: 4618: 15) в toExecute.pu sh .callback ( C: \ Users \ media \ Documents \ Projects \ Mon goose -population \ node_modules \ mongoose \ lib \ model. js: 3083: 22) в toExecute.forEach (C: \ Users \ media \ Documents \ Projects \ Mon goose -population \ node_modules \ mongoose \ lib \ model. js: 3119: 7) в Array.forEach () в utils.promiseOrCallback.cb (C: \ Users \ media \ Documents \ Projects \ Mon goose -population \ node_modules \ mongoose \ lib \ model. js: 3118: 15) в Promise (C: \ Users \ media \ Documents \ Projects \ Mon goose -population \ node_modules \ mongoose \ lib \ utils. js: 283: 5) в новом Promise () в Object.promiseOrCallback (C: \ Users \ media \ Documents \ Projects \ Mon goose -population \ node_modules \ mongoose \ lib \ utils. js: 282: 10) в Function.create (C: \ Users \ media \ Documents \ Projects \ Mon goose -population \ node_modules \ mongoose \ lib \ model. js: 3053: 16) (узел: 42988) UnhandledPromiseRejectionWarning: необработанное отклонение обещания. Эта ошибка возникла либо из-за того, что внутри asyn c -блокировки была выброшена функция без блока catch, либо из-за отклонения обещания, которое не было обработано с помощью .catch (). (идентификатор отклонения: 1) (узел: 42988) [DEP0018] Предупреждение об устаревании: отклонение необработанного обещания устарело. В будущем отклонения обещания, которые не обрабатываются, завершат процесс Node.js с ненулевым кодом выхода.

Как я могу найти решение ??

Ответы [ 2 ]

0 голосов
/ 11 февраля 2020

Я решил проблему.

const CompanySchema = new mongoose.Schema({
    name: String,
    address: String,
    employees: { type: mongoose.Schema.Types.ObjectId, ref: 'employee' }
})

это должно иметь [] в значении сотрудников.

const CompanySchema = new mongoose.Schema({
    name: String,
    address: String,
    employees: [{ type: mongoose.Schema.Types.ObjectId, ref: 'employee' }]
})

во-вторых, ответ для заполнения компании мы должны использовать путь: сотрудники на модель сотрудника

res.json({
        //departments: await Department.find(),
        //employees: await Employee.find().populate('department'),
        company: await Company.find().populate({
            path: 'employees',
            model: 'employee',
            populate: {
                path: 'department',
                model: 'department',
            }
        })
    })

с этими изменениями он работает ... асинхронное ожидание не вызывает никаких проблем

Спасибо за ответ

0 голосов
/ 10 февраля 2020

Ваша ошибка ждет. если вы вызываете await shoud, используйте .exe c () в конце. в вашем коде вы передаете обещания модели вместо возвращаемого значения; Ваш код должен быть таким, как показано ниже.

const mongoose = require('mongoose')
const { ObjectId } = require('mongodb');
const app = require('express')()

mongoose.connect('<connection fine>', { useNewUrlParser: true, useUnifiedTopology: true })
mongoose.connection.once('open', function () {
    console.log('Connection with database')
});
const CompanySchema = new mongoose.Schema({
    name: String,
    address: String,
    employees: { type: mongoose.Schema.Types.ObjectId, ref: 'employee' }
})

const DepartmentSchema = new mongoose.Schema({
    name: String,
    location: String
})

const EmployeeSchema = new mongoose.Schema({
    firstName: String,
    lastName: String,
    mobile: String,
    department: { type: mongoose.Schema.Types.ObjectId, ref: 'department' }
})

let Department = mongoose.model('department', DepartmentSchema)
let Employee = mongoose.model('employee', EmployeeSchema)
let Company = mongoose.model('company', CompanySchema)

app.use("/", async (req, res) => {
    await Department.deleteMany({})
    await Employee.deleteMany({})
    await Company.deleteMany({})
    await Department.create({
        name: 'IT Department',
        location: 'Building A'
    })
    await Department.create({
        name: 'Marketing Department',
        location: 'Building B'
    })
    await Employee.create({
        firstName: 'Manel',
        lastName: 'Jakin',
        mobile: '986374763',
        department: await Department.findOne({ name: 'IT Department' }).exec()
    })
    await Employee.create({
        firstName: 'Laurel',
        lastName: 'Borbas',
        mobile: '967583566',
        department: await Department.findOne({ name: 'Marketing Department' }).exec()
    })

    await Company.create({
        name: 'MagoDev',
        address: 'Algarve',
        employees: await Employee.find().select('_id') // or await Employee.find().exec()
    })

    res.json({
        //departments: await Department.find(),
        //employees: await Employee.find().populate('department'),
        company: await Company.find().populate({
            path: 'employee',
            model: 'employee',
            populate: { path: 'department', model: 'department' }
        }).exec()
    })
})

app.listen(5000, () => console.log("Server on port 5000"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...