Я разрабатываю серверную часть для мобильного приложения, используя 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-проверка, хотя реализация того, что происходит после проверки, варьируется. Поэтому я был бы признателен, если бы решение могло сохранить код для повторного использования для нескольких экземпляров.