Ожидание ответа от app.post в другом app.post - PullRequest
0 голосов
/ 08 апреля 2019

Я разрабатываю серверную часть для мобильного приложения, используя express.js для моего API.

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

Когда пользователи сначала пытаются войти в систему, они размещают свой мобильный номер на сервере, после чего происходит куча обработки, и им отправляется OTP через шлюз SMS.

Теперь, пока этот запрос все еще выполняется, мне нужно подождать, пока пользователи отправят OTP через запрос POST на другой маршрут, проверит его, а затем продолжит выполнение соответствующих шагов в первом продолжающемся запросе POST.

После некоторых поисков в сети я в итоге решил обернуть метод app.post для маршрута verifyOTP в функцию, которая создает и возвращает новое обещание, а затем разрешить его или отклонить после проверки. Это сработало чудесно, когда я впервые выполнил эту операцию после перезапуска сервера, но это все. Он работает только в первый раз, а затем в течение последующих последовательных периодов ни одно из новых обещаний, которые должны быть созданы, не разрешено или отклонено, и первый запрос к маршруту входа остается в ожидании.

Я попробовал несколько вещей, таких как создание функции, обертывающей асинхронный маршрут verifyOTP, и создание обещаний внутри маршрута вместо того, чтобы обернуть его в один, но все равно бесполезно. Вы можете мне помочь?

Ради поиска решения этой проблемы я упростил процесс и провел симуляцию реальной ситуации, используя этот код, и он хорошо имитирует проблему:

Это для имитации первого запроса:

app.get("/test", async function(req, res) {
    console.log("Test route\n");

    var otpCode = Math.floor(Math.random() * (9999 - 2)) + 1;
    var timestamp = Date.now();

    otp = {
        code: otpCode,
        generated: timestamp
    };

    console.log("OTP code sent: " + otpCode + "\n");
    console.log("OTP sent.\n");

    res.end();

    /*  verifyOTP().then(function() {
            console.log("Resolved OTP verification\n\n");
            res.end();
        }).catch(function() {
            console.log("Bad\n\n");
            res.end();
        });*/
});

Это маршрут verifyOTP:

var otp;

app.post("/verifyOTP", function(req, res) {
    console.log("POST request - verify OTP request\n");

    var msg;
    if ((Date.now() - otp.generated) / 1000 > 30) {
        msg = "OTP code is no longer valid.";
        res.status(403).json({
            error: msg
        });
    } else {
        var submitted = req.body.otp;
        if (submitted !== otp.code) {
            msg = "OTP code is incorrect.";
            res.status(403).json({
                error: msg
            });
        } else {
            msg = "Verified.";
            res.end();
        }
    }
    console.log(res.statusCode + " - " + res.statusMessage + "\n");
    console.log(msg + "\n");
});

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

1 Ответ

0 голосов
/ 10 апреля 2019

Что ж, после еще одного собственного исследования я отказался от использования Promises для этого варианта использования и вместо этого использовал Observables RxJS ..

Это решило мою проблему так, как я хочуэто, хотя я должен был сделать некоторые небольшие изменения ..

Для тех, кто наткнулся на мой вопрос в поисках решения той же проблемы, с которой я столкнулся:

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

В этом случае,мы делаем Promise из слушателя (или как он называется в js), поэтому, если вы не удалите слушателя, функция, заключенная в обещание, не завершит работу (я думаю), и вы выиграли 'не получается создать новое Обещание.

Наблюдаемые, с другой стороны, могут использоваться повторно столько раз, сколько вы хотите, см. this для сравнения между Обещаниями и Наблюдаемыми, и этот хороший учебник, который поможет вам понять Observables и как их использовать.См. this , чтобы узнать, как установить RxJS для узла.

Однако, будьте осторожны - по какой-то причине, когда вы подписываетесь на observable, переменные, используемые в функции, передаются в observable.subscribe () остается прежним, он не обновляется при каждом новом запросе, который вы делаете к маршруту наблюдателя.Поэтому, если вы не найдете способ передать переменные, которые изменяются, в функцию наблюдатель.next () внутри наблюдаемого определения, вы получите неверные результаты.

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