Как протолкнуть массив в Mongoose

Я хотел бы обновить данные, вставив массив в документ, но у меня возникла ошибка в res.send (err), вот мой код:

    router.put('/update/:id', passport.authenticate('jwt', {session:false}), (req, res, next)=>{
    User.findById(req.params.id, function(err, user) {
        if (err) {
            console.info(err);
            return res.status(500).send({message: "Error"});
        }
        if (!user) {
            return res.status(404).send({message: "User Not Found"});            
        }
        Company.findById(req.body.company, function(err, company) {
            var students = [req.params.id];
            company.students = students.push(req.params.id);
            // res.send(students);
            company.save(function(err, company){
            if (err){
                return res.send(err);
                // return res.status(500).send({message: "Cannot Update Company, please try again"});
            }
                return res.status(200).send({message: "Update User To Company Success.", company});
            });
        });
    });
});

Вот подробности ошибки после return res.send (err); :

{
    "errors": {
        "students": {
            "message": "Cast to ObjectID failed for value \"2\" at path \"students\"",
            "name": "CastError",
            "stringValue": "\"2\"",
            "kind": "ObjectID",
            "value": 2,
            "path": "students",
            "reason": {
                "message": "Cast to ObjectId failed for value \"2\" at path \"students\"",
                "name": "CastError",
                "stringValue": "\"2\"",
                "kind": "ObjectId",
                "value": 2,
                "path": "students"
            }
        }
    },
    "_message": "Company validation failed",
    "message": "Company validation failed: students: Cast to ObjectID failed for value \"2\" at path \"students\"",
    "name": "ValidationError"
}

Обновление, это Моя схема, я хотел бы добавить пользователя с идентификатором из UserSchema для студентов в CompanySchema:

const CompanySchema = mongoose.Schema({
    nama:{
        type    : String,
        require : true
    },
    alamat:{
        type    : String,
        require : true
    },
    email:{
        type    : String,
        require : true
    },
    telepon:{
        type    : String,
        require : true
    },
    website:{
        type    : String,
        require : true
    },
    status:{
        type    : String,
        require : true
    },
    students:{
        type : mongoose.Schema.Types.ObjectId,
        ref  : 'users'
    }
});

const CompanySchema = mongoose.Schema({
    nama:{
        type    : String,
        require : true
    },
    alamat:{
        type    : String,
        require : true
    },
    email:{
        type    : String,
        require : true
    },
    telepon:{
        type    : String,
        require : true
    },
    website:{
        type    : String,
        require : true
    },
    status:{
        type    : String,
        require : true
    },
    students:{
        type : mongoose.Schema.Types.ObjectId,
        ref  : 'users'
    }
});

Спасибо за все ваши ответы.

Ваш код возвращает ошибку «Не удается обновить компанию, попробуйте еще раз». Вместо этого, почему бы вам также не включить информацию из объекта "err" вместо того, чтобы отбросить ее. Это даст вам больше информации о том, что происходит.

goamn 05.04.2018 07:42

Я бы посоветовал вам распечатать объект компании, а также распечатать объект ошибки. Это даст вам больше информации о том, что происходит не так. Возможно, данные поступают не так, как нужно вашей модели.

Ishan Koul 05.04.2018 07:58

В вашей схеме students должен быть объявлен как массив типа students: [{ type : mongoose.Schema.Types.ObjectId,ref : 'users' }]

chridam 05.04.2018 09:48
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
3
1 019
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Есть несколько причин, по которым ваш код не работает.

  1. Сначала покажите дизайн схемы. Может быть, есть недоработка.
  2. Вы добиваетесь этого с помощью company.students.push (req.params.id).
  3. Если вы хотите протолкнуть весь массив, попробуйте использовать company.students.push (студенты).
  4. Зарегистрируйте объект ошибки.

Я получил в своем терминале сообщение «TypeError: company.students.push не является функцией».

Fatih 05.04.2018 08:12

Я думаю, когда вы сохраняете req.params.id в varibale студентов, попробуйте передать его в идентификатор объекта мангуста. Нравится mongoose.Types.ObjectID(req.params.id)

Asad Marfani 05.04.2018 08:16

Вы пытаетесь преобразовать строку в objectId. Для сохранения этого значения используйте mongoose.Types.ObjectId. Это решит вашу проблему. Сообщите мне, если это поможет. Спасибо

you are making two mistakes here
    1) your schema type is ObjectId but you are pushing string
      cast string to ObjectId : mongoose.Types.ObjectId
    2) storing in students an array,which would become something like this
       => var students=[ObjectId('')]
    3) now again before assinging to company.students you are pushing the 
            same objectId to students variable
    try following lines

       // var students = [req.params.id];you don't need this line
        company.students.push(req.params.id)

Я получил "TypeError: company.students.push не является функцией"

Fatih 05.04.2018 09:31

убедитесь, что поле student является массивом student: [{type: db.Schema.Types.ObjectId, ref: ''}]

rakesh ROCKING 05.04.2018 09:47

Model.findById() ожидает, что параметр будет действительным objectID со следующими описаниями

  • 4-байтовое значение, представляющее секунды с эпохи Unix,
  • 3-байтовый идентификатор машины
  • 2-байтовый идентификатор процесса и
  • 3-байтовый счетчик, начинающийся со случайного значения.

И в вашей ошибке указано, что вы пытаетесь передать ему "2", который не соответствует стандартам objectId. Вы должны передать правильный идентификатор findById.

Вы можете использовать validator, чтобы убедиться, верен ли ваш переданный параметр id. Что-то вроде

ну вы можете установить его с npm install validator

И подтвердите идентификатор

if (!validator.isMongoId(req.headers.postid)){ res.send("invalid post id ") }

пс. validator дает вам действительно красивые способы проверки различных вещей

Другие вопросы по теме