Как упростить создание функции обратного вызова внутри маршрута, который использует те же параметры? - PullRequest
0 голосов
/ 25 августа 2018

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

Дело в том, что для проверки требуются те же параметры, что и для обратного вызова. Есть ли способ упростить это? Я искал это в стеке и Google, но не смог найти ответ. Я не хочу писать req, res, следующий дважды в фактическом вызове. Я понимаю, что первый запрос, res, next направляются в обратный вызов, но все еще кажется странным писать это так. Такое ощущение, что определенно есть лучший подход, но я просто не знаю, что это такое.

Вот ситуация:

function verifyCaptcha(req, res, next, callback) {

    let captchaResponse = req.body.captchaResponse;

    let captchaSecret = "it's a secret";

    let captchaURL = "https://www.google.com/recaptcha/api/siteverify?"
    + "secret=" + encodeURIComponent(captchaSecret) + "&"
    + "response=" + encodeURIComponent(captchaResponse) + "&"
    + "remoteip" + encodeURIComponent(req.connection.remoteAddress);

    // request is ASYNC, that's why I need the callback
    request(captchaURL, function(error, response, body) {
        callback(req, res, next);
        return;
    });
};


router.post('/login', function(req, res, next) {

    // example call INSIDE a route (here's the problem b/c params are repeated in the call
    verifyCaptcha(req, res, next, function(req, res, next){
        // do stuff
    });

};

Ответы [ 2 ]

0 голосов
/ 25 августа 2018

Обещания должны избегать адских вызововВсе популярные библиотеки на основе обратных вызовов имеют многообещающие аналоги, это request-promise для request.Это можно записать синхронно с async..await:

const request = require('request-promise');

async function verifyCaptcha(req, res) {
    let captchaResponse = req.body.captchaResponse;

    let captchaSecret = "it's a secret";

    let captchaURL = "https://www.google.com/recaptcha/api/siteverify?"
    + "secret=" + encodeURIComponent(captchaSecret) + "&"
    + "response=" + encodeURIComponent(captchaResponse) + "&"
    + "remoteip" + encodeURIComponent(req.connection.remoteAddress);

    const result = await request(captchaURL);
    ...
};


router.post('/login', async function(req, res, next) {
    try {
        await verifyCaptcha(req, res);
    } catch (err) {
        next(err);
    }
};

Как объяснено в в этом вопросе , Express не поддерживает обещания изначально, все отклонения должны обрабатыватьсяdeveloper, async тело функции промежуточного программного обеспечения / обработчика должно быть заключено в try..catch.

0 голосов
/ 25 августа 2018

Согласно экспресс-документам, вы можете связать промежуточное ПО, просто добавив его в маршрутный вызов.

http://expressjs.com/en/4x/api.html#app.use

, что позволяет вам сделать это:

function verifyCaptcha(req, res, next) {
    let captchaUrl = ...

    request(captchaUrl, function(error, response, body) {
        if (error) res.sendStatus(403)
        next()
    }
}

router.post('/login', verifyCaptcha, function(req, res, next) {
    // this will only run if verifyCaptcha calls next()
}

Конечный результат намного удобнее читать на практике.

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