Saya perlu memposting beberapa array secara bersamaan sehingga saya dapat mencapai ini:

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

Saya menggunakan formulir dinamis yang dapat menghasilkan bidang input baru untuk array detail. jadi ini adalah model skema saya:

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

Ini adalah posting rute saya:

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('/');
            })
    }
});

Kirim posting berhasil, hanya saja hasilnya tidak seperti yang saya inginkan:

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

Saya harap Anda dapat membantu saya, terima kasih!

2
Akbar 9 Juli 2020, 03:58

1 menjawab

Jawaban Terbaik

Mari kita asumsikan Anda memiliki detail Anda dalam request body.

req.body.details akan terlihat seperti ini:

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

Anda kemudian dapat menyimpannya sama sekali seperti:

detail: req.body.details

Perhatikan bahwa Skema Anda untuk detailnya agak aneh:

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
}]

Sebaliknya, saya pikir Anda bisa melakukan:

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

Sunting:

Karena Anda tampaknya tidak memvalidasi detailnya, Anda bisa membuatnya menjadi array di Skema Anda (terserah Anda dan apa yang terbaik).

detail: { type: Array }

Secara umum req.body.details bisa datang dari mana pun Anda membuat permintaan. Itu bisa diurutkan dan sama dengan array yang ingin Anda simpan di database.


Saya tidak sepenuhnya mengetahui apa yang ada di req.body.size Anda misalnya tetapi jika itu adalah array seperti ["M","S"] maka Anda akan mengekstrak setiap elemen dan membuat objek terpisah yang kemudian akan Anda dorong ke array yang Anda akan disimpan di database Anda.

Lihat di bawah ini:

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)

Dalam kasus Anda, Anda bisa langsung menggunakan req.body.size[i] dll, tidak perlu menginisialisasi variabel.

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]
  })
}
1
Jakub A Suplicki 10 Juli 2020, 00:16