[英](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
一個更清晰的方法是讓login
也async
,然后你也可以在那里使用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.