第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

等待另一個app.post中來自app.post的響應

等待另一個app.post中來自app.post的響應

元芳怎么了 2021-04-09 18:11:50
我正在為我的API使用express.js開發(fā)移動應用程序的后端。對于此移動應用程序,用戶使用手機號碼登錄,將OTP代碼發(fā)送到他們的手機,并且他們需要將收到的OTP發(fā)送回服務器以進行驗證。當用戶首次嘗試登錄時,他們將其手機號碼發(fā)布到服務器,然后進行大量處理,然后通過SMS網(wǎng)關(guān)向他們發(fā)送OTP?,F(xiàn)在,當此請求仍在進行時,我需要等待用戶通過POST請求將OTP發(fā)送到另一條路由,對其進行驗證,然后在第一個正在進行的POST請求中繼續(xù)執(zhí)行適當?shù)牟襟E。經(jīng)過網(wǎng)上搜索后,我最終決定將verifyOTP路由的app.post方法包裝到一個函數(shù)中,該函數(shù)創(chuàng)建并返回一個新的Promise,然后對其進行解析或在驗證后拒絕它。重新啟動服務器后,這是我第一次執(zhí)行此操作,效果非常好,僅此而已。它僅在第一次工作,然后在隨后的連續(xù)時間內(nèi),沒有解決或拒絕應創(chuàng)建的新承諾,并且對登錄路徑的第一個請求仍在等待。我嘗試了很多類似的事情,例如使該函數(shù)使verifyOTP路由異步包裝,并在路由內(nèi)部創(chuàng)建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驗證的地方,盡管驗證后發(fā)生的事情的實現(xiàn)方式有所不同。因此,如果解決方案仍然可以使代碼可重復用于多個實例,我將不勝感激。
查看完整描述

1 回答

?
縹緲止盈

TA貢獻2041條經(jīng)驗 獲得超4個贊

好吧,在我自己進行了一些進一步的研究之后,我放棄了對此用例使用Promises的方式,而是使用RxJS的Observables。

盡管我必須進行一些細微的修改,但它幾乎可以按照我想要的方式解決了我的問題。

對于那些偶然發(fā)現(xiàn)我的問題并為我面臨的同樣問題尋求解決方案的人:

承諾只能被解決或拒絕一次,據(jù)我所知,除非Promises函數(shù)完成運行,否則您無法使用相同的代碼創(chuàng)建一個新的(如果我對此代碼有誤,請更正我,我真的很感激,這只是基于我個人的觀察和猜測),除非您創(chuàng)建了一個全新的Promise,否則您將無法再次解決它。

在這種情況下,我們將根據(jù)偵聽器(或js中所謂的內(nèi)容)做出Promise,因此,除非刪除偵聽器,否則答應中扭曲的函數(shù)將無法完成運行(我認為),并且您不會創(chuàng)建一個新的Promise。

另一方面,Observables可以根據(jù)需要進行多次重用,有關(guān)此內(nèi)容可在Promises和Observables之間進行比較,請參見此內(nèi)容,這是一個很好的教程,可以幫助您了解Observables以及如何使用它們。見這對如何安裝RxJS節(jié)點。

但是,請注意-由于某種原因,一旦您訂閱了一個observable,傳遞給observable.subscribe()的函數(shù)中使用的變量將保持不變,它不會隨著您對觀察者路由的每個新請求而更新。因此,除非找到一種方法將可更改的變量傳遞到可觀察的定義內(nèi)的observer.next()函數(shù)中,否則您將得到錯誤的結(jié)果。


查看完整回答
反對 回復 2021-04-22
  • 1 回答
  • 0 關(guān)注
  • 204 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號