簡體   English   中英

(JavaScript) Function 返回一個未定義的值

[英](JavaScript) Function returning an undefined value

我有一個 function,它從 Firebase 數據庫讀取數據,並返回它找到的有關用戶的任何數據。

授權.js:

const login = (db, token) => {
    db.collection('users').get().then(async (e) => {
        var i = []
        e.forEach(async (doc) => {
            if (doc.data().access_token === token){
                i.push(doc.data().id)
                return doc.data()
            }
        })
        if (i.length === 0) return false
    }).catch((error) => {
        return false
    })
}
module.exports = login

應用程序.js:

app.post('/token/:token', async (req, res) => {
    res.send(await login(db, req.params.token))
})

authorize.js中,我發現了錯誤,但沒有記錄它。 當我console.log()將直接在 function 內部返回的值時,沒有發生任何錯誤,它給了我想要的結果。

您缺少兩個return 此外,您在e.forEach async中有 function 這意味着它將在您的代碼的 rest 之后運行,因此您不會得到結果,請刪除它(因為您無論如何都不會在那里做任何異步操作):

const login = (db, token) => {
    // v HERE v - you need to return the promise
    return db.collection('users').get().then(async (e) => {
        var i = []
        // v HERE v - no async
        e.forEach((doc) => {
            if (doc.data().access_token === token){
                i.push(doc.data().id)
                // Also, no need for a return here, since it doesn't do anything
            }
        })
        if (i.length === 0) return false
        return i // << instead, here was another return missing
    }).catch((error) => {
        return false
    })
}
module.exports = login

一個更清晰的方法是讓loginasync ,然后你也可以在那里使用await

async function login (db, token) {
    try {
        const e = await db.collection('users').get()
        const i = []

        for (const doc of e) {
            if (doc.data().access_token === token){
                i.push(doc.data().id)
            }
        }

        if (i.length === 0) return false
        return i
    } catch (e) {
        return false
    }
}

module.exports = login

這可以進一步簡化:

async function login (db, token) {
    try {
        const matchingUserIds = await db.collection('users').get()
            .map(doc => doc.data())
            .filter(docData => docData.access_token === token)
            .map(docData => docData.id)

        return matchingUserIds.length ? matchingUserIds : false
    } catch (e) {
        return false
    }
}

module.exports = login

(我想知道是否沒有更好的方法來通過數據庫中的訪問令牌過濾用戶。現在看來您將獲取所有用戶,然后在這個 function 中檢查令牌;它可能更具可擴展性首先通過令牌查詢數據庫。)

帶有等待的異步 function 始終為 go,但在 function 內部看不到任何等待。

更清晰。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM