Как разместить несколько массивов Nodejs - PullRequest
1 голос
/ 09 июля 2020

Мне нужно опубликовать несколько массивов одновременно , чтобы я мог добиться этого:

{
 name:"John Snow",
 detail: [
    {size: "M", total: 5, color: "red"},
    {size: "S", total: 2, color: "black"}
 ]
}

Я использую форму Dynami c, которая может генерировать новое поле ввода для деталь массив. Итак, это моя модель схемы:

const OrderSchema = new Schema({
    name:{
        type: String,
        required: true
    },
    detail:[{
        size:{},
        color:{},
        total:{}
    }],
    date:{
        type: Date,
        default: Date.now
    }
});

это мой маршрутный пост:

router.post('/add', (req, res) => {
    let errors = [];

    if (!req.body.name) {
        errors.push({ text: 'Your customer name is empty' });
    }
    if (errors.length > 0) {
        res.render('orders/add', {
            errors: errors,
            customer: req.body.name,
            detail:[{
                size: req.body.size,
                color: req.body.color,
                total: req.body.total
            }]
        });
    } else {
        const newUser = {
            customer: req.body.name,
            detail:[{
                size: req.body.size,
                color: req.body.color,
                total: req.body.total
        }
        new Order(newUser)
            .save()
            .then(order => {
                res.redirect('/');
            })
    }
});

отправить сообщение - это работа, это просто результат не тот, который я хочу:

{
 name:"John Snow",
 detail: [
    {size: ["M","S"], total: [5,2], color: ["red", "black"]}
 ]
}

Надеюсь, ты мне поможешь, спасибо!

1 Ответ

1 голос
/ 09 июля 2020

Предположим, у вас есть ваши данные в request body.

req.body.details будет выглядеть так:

 details: [
    {size: "M", total: 5, color: "red"},
    {size: "S", total: 2, color: "black"}
 ]

Затем вы можете просто сохранить его так:

detail: req.body.details

Обратите внимание, что ваша схема для деталей немного странна:

detail:[{
    size:{}, // seems to be a string not an object
    color:{}, // seems to be a string not an object
    total:{} // seems to be a number not an object
}]

Вместо этого, я думаю, вы могли бы сделать:

detail:[{
   size:{type: String},
   color:{type: String}, 
   total:{type: Number} 
}]

Изменить:

Поскольку вы, похоже, не проверяете детали, вы можете просто сделать его массивом в своей схеме (это зависит от вас и что лучше всего работает).

detail: { type: Array }

Обычно req.body.details может приходить откуда бы вы ни сделали запрос. Он может быть отсортирован и равен массиву, который вы хотите сохранить в базе данных.

Я не полностью знаю, что находится в вашем req.body.size, например, но если это массив, такой как ["M","S"], вы должны извлечь каждый элемент и создать отдельные объекты, которые затем вы sh в массив которые вы сохраните в своей базе данных.

Посмотрите ниже:

let size = ["M","S"]
let total = [5,2]
let color = ["red", "black"]
    
let detailsToDb = []
for (let i=0; i<size.length; i++) {
   detailsToDb.push({
     size: size[i],
     color: color[i],
     total: total[i]
   })
}
console.log(detailsToDb)

В вашем случае вы можете использовать req.body.size[i] et c. сразу, не нужно инициализировать переменные.

let detailsToDb = []
  for (let i=0; i<req.body.size.length; i++) {
    detailsToDb.push({
      size: req.body.size[i],
      color: req.body.color[i],
      total: req.body.total[i]
  })
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...