Как совместить два промежуточного ПО и экспортировать как одно? - PullRequest
1 голос
/ 01 июня 2019

У меня есть служебный файл, который в основном имеет две функции (одна для определения местоположения пользователя и другая для получения сведений об устройстве пользователя), выступающая в качестве промежуточного программного обеспечения. Теперь я хотел бы знать, возможно ли объединить оба промежуточного программного обеспечения в одно целое, чтобы его можно было использовать с другими промежуточными программами на маршруте. Я также хотел бы иметь свободу использования функций из служебного файла индивидуально, когда это необходимо.

Файл утилиты

const axios             = require("axios");
const requestIp         = require("request-ip");

const getDeviceLocation = async (req, res, next) => {
    try {
        // ToDO: Check if it works on production
        const clientIp  = requestIp.getClientIp(req);
        const ipToCheck = clientIp === "::1" || "127.0.0.1" ? "" : clientIp;

        const details = await axios.get("https://geoip-db.com/json/" + ipToCheck);

        // Attach returned results to the request body
        req.body.country    = details.data.country_name;
        req.body.state      = details.data.state;
        req.body.city       = details.data.city;

        // Run next middleware
        next();
    }
    catch(error) {
        return res.status(500).json({ message: "ERROR_OCCURRED" });
    }
};

const getDeviceClient = async (req, res, next) => {
    const userAgent = req.headers["user-agent"];

    console.log("Device UA: " + userAgent);
    next();
};

module.exports = { getDeviceLocation, getDeviceClient };

Примеры маршрутов

app.post("/v1/register", [getDeviceLocation, getDeviceClient, Otp.verify], User.create);

app.post("/v1/auth/google", [getDeviceLocation, getDeviceClient, Auth.verifyGoogleIdToken], Auth.useGoogle);  

Я бы хотел объединить getDeviceLocation и getDeviceClient в одно слово getDeviceInfo, но при этом иметь возможность использовать getDeviceLocation и getDeviceClient по отдельности, когда это требуется на любом маршруте.

Ответы [ 2 ]

1 голос
/ 01 июня 2019

В вашем случае, возможно, вы можете использовать что-то простое, как это

const getDeviceInfo = async (req, res, next) => {
    await getDeviceClient(req, res, async () => {
        await getDeviceLocation(req, res, next)
    })
}

Но вам, возможно, придется обрабатывать ошибки.

0 голосов
/ 01 июня 2019

Используя модуль подключения узла, вы можете объединить промежуточное программное обеспечение и предоставить ему новую конечную точку. Ссылка здесь образец кода https://blog.budiharso.info/2015/07/28/Combine-multiple-express-middleware/

...