我正在为我的API使用express.js开发移动应用程序的后端。
对于此移动应用程序,用户使用手机号码登录,将OTP代码发送到他们的手机,并且他们需要将收到的OTP发送回服务器以进行验证。
当用户首次尝试登录时,他们将其手机号码发布到服务器,然后进行大量处理,然后通过SMS网关向他们发送OTP。
现在,当此请求仍在进行时,我需要等待用户通过POST请求将OTP发送到另一条路由,对其进行验证,然后在第一个正在进行的POST请求中继续执行适当的步骤。
经过网上搜索后,我最终决定将verifyOTP路由的app.post方法包装到一个函数中,该函数创建并返回一个新的Promise,然后对其进行解析或在验证后拒绝它。重新启动服务器后,这是我第一次执行此操作,效果非常好,仅此而已。它仅在第一次工作,然后在随后的连续时间内,没有解决或拒绝应创建的新承诺,并且对登录路径的第一个请求仍在等待。
我尝试了很多类似的事情,例如使该函数使verifyOTP路由异步包装,并在路由内部创建promise,而不是将其包装在一个路由中,但仍然没有用。你能帮助我吗?
为了找到该问题的解决方案,我简化了过程,并使用以下代码对实际情况进行了模拟,它很好地模拟了问题:
这是模拟第一个请求:
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验证的地方,尽管验证后发生的事情的实现方式有所不同。因此,如果解决方案仍然可以使代码可重复用于多个实例,我将不胜感激。
缥缈止盈
相关分类