Попытка добавить товар в список в NodeJS («Ошибка ввода неопределена») - PullRequest
1 голос
/ 24 февраля 2020

Я только что начал NodeJS, поэтому я на начальном уровне. Я пытаюсь создать приложение для списка покупок с MongoDB, в котором пользователь входит в систему, создает список, а затем добавляет элементы в этот список. Я могу зарегистрироваться, войти в систему и создать список, но когда я пытаюсь добавить в него элементы, вот когда я сталкиваюсь с этим: «TypeError: Невозможно прочитать свойство« products »из undefined». Код для этого:

    const user = req.user;
    const shoppinglist_id = req.body.shoppinglist_id;
    const name = req.body.name;

    let new_product = product_model({
        title: req.body.title,
        imagePath: req.body.imagePath,
        quantity: req.body.quantity
    });
    new_product.save().then(() => {
        shoppinglist_id.products.push(new_product);
        console.log('product saved');
        shoppinglist_id.save().then(() => {
            return res.redirect('/');
        });
    }); ```

User model:
const user_schema = new Schema({
    name: {
        type: String,
        required: true
    },
    shoppinglists: [{
        type: mongoose.Schema.Types.ObjectId,
        ref: 'shoppinglist',
        req: true
    }]
});

Shoppinglist model:
const shopping_list_schema = new Schema({
    name: {
        type: String,
        required: true
    },
    products: [{
        type: mongoose.Schema.Types.ObjectId,
        ref: 'product',
        req: true
    }]
});

Product model:
var schema = new Schema({
   imagePath: {type: String, required: true}, 
   title: {type: String, required: true},
   quantity: {type: Number, required: true}
});

Есть идеи, что я делаю не так? Я знаю, что проблема с этой строкой: "shoppinglist_id.products.pu sh (new_product);", я попробовал все на этом, "user.shoppinglists.products" et c. Ничего не работает Любая помощь?

РЕДАКТИРОВАТЬ: Я также опубликую в качестве ссылки мой добавить список покупок, который работает нормально.

    const user = req.user;
    let new_shoppinglist = shopping_list_model({
        name: req.body.name,
        products: req.body.products
    });
    new_shoppinglist.save().then(() => {
        console.log('shoppinglist saved');
        user.shoppinglists.push(new_shoppinglist);
        user.save().then(() => {
            return res.redirect('/');
        });
    });
}```


EDIT #2:
I am adding how I am getting to shoppinglist-view:
´´´
const get_shoppinglist = (req, res, next) => {
    const shoppinglist_id = req.params.id;
    shopping_list_model.findOne({
        _id: shoppinglist_id
    }).then((shoppinglist) => {
        shoppinglist.populate('products')
        .execPopulate()
        .then((shoppinglist) => {
            let data = {
                shoppinglist: shoppinglist

            };
            console.log(data);
            let html = shoppinglist_views.shoppinglist_view(data);
            res.send(html);
        });
    });
};´´´

And shoppinglist-view:
´´´
const shoppinglist_view = ((data) => {
    let html = `
    <html>
    <body>
    <h1></h1>
    <h2>${data.shoppinglist.name}</h2>
    <h4><a href="/">Go back</a></h4>


    <br>
    `
     data.shoppinglist.products.forEach((product) => {
        html += products
         html += `
         <div>
         <p>
         <h2>Name of the shopping list: ${shoppinglists.shoppinglist.name}</h2>
         <h3> Name: ${product.title}<br></h3>
         <img src="${product.imagePath}" width="50px" height="50px" />
         quantity: ${product.quantity} </p>
         </div>
         </body>
         </html>
         `;
        });
        html += `
        <form action="/add-product" method="POST">
        <p>Add products</p><br>
        Title?<br>
            <input type="text" name="title"><br>
        Image-link<br>
            <input type="img" name="imagePath"><br>
        Quantity?<br>
            <input type="number" name="quantity"><br><br>
            <button type="submit">Add to list</button>
        </form>
        </html>
        </body>`;
         return html;
´´´

1 Ответ

1 голос
/ 24 февраля 2020

Это потому, что shoppinglist_id не определено. В данный момент вы получаете значение следующим образом:

const shoppinglist_id = req.body.shoppinglist_id;

Другими словами, req.body не имеет свойства с именем shoppinglist_id. Если вы напечатаете значение req.body, вы, скорее всего, увидите, что это строка. Если вы пытаетесь отправить / получить JSON данные (что, я полагаю, вы), вы должны сначала проанализировать тело запроса:

const data = JSON.parse(req.body);
const shoppinglist_id = data.shoppinglist_id;

Или даже лучше:

const data = JSON.parse(req.body);
const { shoppinglist_id } = data;

Обратите внимание, что вы всегда должны анализировать ненадежных JSON внутри блока try ... catch, но это еще один урок для другого дня.

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