Как мне сделать несколько запросов в продолжении? - PullRequest
0 голосов
/ 27 мая 2020

Я пытаюсь сделать несколько запросов к конечной точке фильтра. Скажем, конечная точка router.get('/filter', caseController.getCasesByFilteredRecord);

Я хочу, чтобы пользователь мог выполнять несколько запросов во внешнем интерфейсе. На основе документации Sequelize я придумал приведенный ниже код. Но когда я его тестировал, он использовал AND для привязки всего запроса вместо отображения результата для выбранного запроса. См. Ниже мой код:

ИЗМЕНЕНО НА ОСНОВЕ ПРЕДЛОЖЕНИЯ @MOLDA

exports.getCasesByFilteredRecord = async (req, res) => {
    try {
        var where = [];
        // iterate over the params
        for (let q in req.query) {
            var obj = {};
            obj[q] = { [Op.eq]: req.query[q] };
            // if q is discoveryMethod then the obj is { discoveryMethod: { [Op.eq]: req.query.discoveryMethod } }
            where.push(obj);
        }
        const filteredResult = await Case.findAll({
            attributes: { exclude: ['id', 'countryId', 'caseFullname', 'casePhone', 'createdAt', 'caseCommunityName', 'deletedAt'] },
            where: {
              [Op.or]: [
            {
             discoveryMethod: {
                [Op.eq]: req.query.discoveryMethod
                  }
            },
            {
            caseAge: {
                [Op.eq]: req.query.caseAge
                  }
            },
            {
            caseGender: {
                [Op.eq]: req.query.caseGender
                  }
            },
            {
            caseComorbidity: {
                [Op.eq]: req.query.caseComorbidity
                  }
            },
            {
            testResult: {
                [Op.eq]: req.query.testResult
                  }
            },
            {
            priority: {
                [Op.eq]: req.query.priority
                  }
                },
            {
            caseStatus: {
                [Op.eq]: req.query.caseStatus
                        }
            },
            {
            requireBedAdmission: {
                [Op.eq]: req.query.requireBedAdmidsion
                        }
            },
            {
            requireICUBed: {
                [Op.eq]: req.query.requireICUBed
                        }
            },
            {
            requireVentilator: {
              [Op.eq]: req.query.requireVentilator
                        }
            }  
                  ]
              },
            order: [
                ['createdAt', 'DESC']
            ],
            limit: 10
        });
        if (filteredResult.length === 0) {
            return res.json({
                message: 'There are no case records for this query. Please unselect some items.'
            })
        };
        res.status(200);
        res.json({
            message: 'Case query records retrieved.',
            data: filteredResult
        });
    } catch (err) {
        console.log(err);
        res.status(500)
            .json({
                message: "There is an error retrieving case query records!",
                err
            });
    };
};

Предполагается, что мой запрос похож на http://localhost:8004/api/v1/cases/filter?caseComorbidity=HBP&testResult=positive&caseGender=Male

Sequelise будет выбирать из Случай, когда эти запросы представляют собой введенные значения И объединяют все нулевые значения для других. Но я хочу, чтобы он только выбирал, где я ввел значения в запросе, и опускал нулевые запросы.

1 Ответ

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

Вы должны создать where на основе полученных вами параметров запроса.

exports.getCasesByFilteredRecord = async (req, res) => {
    try {
        var where = [];
        // iterate over the params
        for (let q in req.query) {
            var obj = {};
            obj[q] = { [Op.eq]: req.query[q] };
            // if q is discoveryMethod then the obj is { discoveryMethod: { [Op.eq]: req.query.discoveryMethod } }
            where.push(obj);
        }
        const filteredResult = await Case.findAll({
            attributes: { exclude: ['id', 'countryId', 'caseFullname', 'casePhone', 'createdAt', 'caseCommunityName', 'deletedAt'] },
            where: {
                [Op.or]: where // assign the "where" array here
            },
            order: [
                ['createdAt', 'DESC']
            ],
            limit: 10
        });
        if (filteredResult.length === 0) {
            return res.json({
                message: 'There are no case records for this query. Please unselect some items.'
            })
        };
        res.status(200);
        res.json({
            message: 'Case query records retrieved.',
            data: filteredResults
        });
    } catch (err) {
        console.log(err);
        res.status(500)
            .json({
                message: "There is an error retrieving case query records!",
                err
            });
    };
};

Я не тестировал его, поэтому ожидайте некоторых ошибок;)

EDIT

exports.getCasesByFilteredRecord = async (req, res) => {
    try {
        const filteredResult = await Case.findAll({
            attributes: { exclude: ['id', 'countryId', 'caseFullname', 'casePhone', 'createdAt', 'caseCommunityName', 'deletedAt'] },
            where: req.query, // <-- req.query -> { discoveryMethod: 'blabla' } -> some.url?discoveryMethod=blabla
            order: [
                ['createdAt', 'DESC']
            ],
            limit: 10
        });
        if (filteredResult.length === 0) {
            return res.json({
                message: 'There are no case records for this query. Please unselect some items.'
            })
        };
        res.status(200);
        res.json({
            message: 'Case query records retrieved.',
            data: filteredResults
        });
    } catch (err) {
        console.log(err);
        res.status(500)
            .json({
                message: "There is an error retrieving case query records!",
                err
            });
    };
};
...