Как можно фильтровать в объекте Dynami c по express js - PullRequest
0 голосов
/ 08 мая 2020

Я использую express для REST api, я хочу сделать некоторый фильтр для моих сообщений с помощью req.query, в структуре сообщений я использую динамический c Объект, который он вызывает параметры, его моя структура сообщения:

{
    "category": [
        {
            "id": 2,
            "name": "mashin"
        },
        {
            "id": 102,
            "name": "savari"
        }
    ],
    "_id": "5eb52dc8e2838431703942eb",
    "user": "5deea38cfc84f42590e01942",
    "title": "qazwsx",
    "description": "qazwsx",
    "options": {
        "price": "100"
    },
    "phone": "",
    "date": "2020-05-08T10:00:40.626Z",
    "__v": 0
},
{
    "category": [
        {
            "id": 2,
            "name": "mashin"
        },
        {
            "id": 102,
            "name": "savari"
        }
    ],
    "_id": "5eb52db6e2838431703942ea",
    "user": "5deea38cfc84f42590e01942",
    "title": "xswzaq",
    "description": "qazwsx",
    "options": {
        "transaction_type": "",
    },
    "phone": "",
    "date": "2020-05-08T10:00:22.783Z",
    "__v": 0
},

Как видите, у некоторых постов есть цена, а у других нет. для фильтра в бэкэнде я использую этот код:

    router.get('/', async (req, res) => {
    try {
        const posts = await Post.find().sort({ date: -1 });

        let response = [];

        const q = {}  // Query object
        if (req.query.city) { q.city = req.query.city }
        if (req.query.title) { q.title = req.query.title }

        if (Object.keys(q).length === 0) {
            // NO query parameters, send it all...
            response = posts;
        } else {
            // We have a query, filter response to match request
            response = posts.filter(post => {
                return Object.keys(q).every((key) => post[key] === q[key]);
            }, q);
        }

        // Filter by Price
        if (req.query.PriceFrom) {
            response.filter(post => {
                if (typeof (post.options.price) !== 'undefined') {
                    console.log('p' + post.options)
                }
                else {
                    console.log('n' + post.options)
                }
            })
        }

        // de-duplication:
        response = _.uniqBy(response, 'id');

        const resultPosts = response.slice(req.query.start, req.query.count)
        res.json(resultPosts);

    } catch (err) {
        console.error(err.message);
        res.status(500).send('Server Error!');
    }
});

, а в console.log я получаю эту ошибку:

[0] { price: '100' }
[0] Cannot read property 'price' of undefined
[0] { transaction_type: '', price: '100' }
[0] { transaction_type: '200', price: '200' }
[0] { transaction_type: '1', price: '100' }

У вас есть решение или идея?

1 Ответ

0 голосов
/ 08 мая 2020

Проблема в том, что вы пытаетесь получить доступ к .price, где post.options не определено. Так что добавьте это, он должен поймать undefined post.options без выдачи ошибки.

 if (post.options && typeof (post.options.price) !== 'undefined') {}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...