Передача массива в теле запроса в узле express js - PullRequest
1 голос
/ 19 июня 2020

У меня есть массив, который я хотел бы передать в теле моего запроса для POST-запроса. В случае успеха новый документ должен быть вставлен в MongoDB. Вот мой код:

app.post(`/api/add`, async (req, res) => {
    collection.create( {  'id': req.body.id, 
                        'name': req.body.name, 
                        'date': req.body.date,
                        'groups': [
                            { 'id': req.body.groups.id, 'title': req.body.groups.title, 'teamMemberIds': [ req.body.groups.teamMemberIds] }]
                    }, 
    (err, result ) => {
        if (err) {
            console.log('error', err)
        } else {
            console.log('updated', result);
            res.status(200).send(result);
        }
    })
});

Я отправляю тело запроса в почтальоне следующим образом:

{
    "id": "1",
    "name": "Saved Team 1",
    "date": "1/1/20",
    "groups": [
        {"id": "group-1", "title": "test saved group 1", "teamMemberIds": ["bpumper", "jdoe"] },
        {"id": "group-2", "title": "test saved group 2", "teamMemberIds": ["bsimmons", "ljames"] },
    ]
}

Вот моя схема mon goose:

const savedTeamSchema = new Schema({
    id: String,
    name: String,
    date: String,
    groups: [{ id: String, title: String, teamMemberIds: [String]}]
})

Однако после выполнения запроса в коллекцию вставляется именно этот документ:

{
    "_id" : ObjectId("5eed13b216b4836f406b6f63"),
    "id" : "1",
    "name" : "Saved Team 1",
    "date" : "1/1/20",
    "groups" : [ 
        {
            "teamMemberIds" : [ 
                null
            ],
            "_id" : ObjectId("5eed13b216b4836f406b6f64")
        }
    ],
    "__v" : 0
}

Я не могу понять, как добавить объект группы в groups массив. Что мне не хватает?

1 Ответ

1 голос
/ 20 июня 2020
 { 'id': req.body.groups.id, 'title': req.body.groups.title, 'teamMemberIds': [ req.body.groups.teamMemberIds] }]

Вы не можете получить доступ к таким полям элементов массива: req.body.groups.id, req.body.groups.title и req.body.groups.teamMemberIDs. Чтобы получить поля во вложенном массиве, вам нужно будет сделать что-то вроде этого req.body.groups[index].id.

Но делать все это не обязательно, поскольку ваши req.body и mon goose схемы являются то же самое вы можете просто передать целиком req.body.groups в groups, как показано ниже.

app.post(`/api/add`, async (req, res) => {
    collection.create( {  'id': req.body.id, 
                        'name': req.body.name, 
                        'date': req.body.date,
                        'groups': req.body.groups //change this line of code.
                    }, 
    (err, result ) => {
        if (err) {
            console.log('error', err)
        } else {
            console.log('updated', result);
            res.status(200).send(result);
        }
    })
});

Или, что еще лучше, вы можете просто добавить req.body целиком к collection.create()

app.post(`/api/add`, async (req, res) => {
    collection.create(req.body, 
    (err, result ) => {
        if (err) {
            console.log('error', err)
        } else {
            console.log('updated', result);
            res.status(200).send(result);
        }
    })
});

В случае, если ваша схема req.body и mon goose имеет разные форматы, тогда для частей массива вы можете использовать метод массива map, чтобы изменить формат массива до создания документа.

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