如何在 node.js 混乱中处理 async/await 和 promises

How to handle async/await and promises in node.js confusion

我查了很多类似的问题所有的资料,我很困惑。无论 phone 数字是否在数据库中,这都会返回相同的结果。其他带有异步和承诺的版本一直在使应用程序崩溃。请帮助

如何使用管理 SDK 从 Firebase 实时数据库获取值并使用该值确定输出。此外,由于某种原因,它有时看起来异常缓慢

auth.controller.js

const validate = require('../utils/validate');
const { getItem, setItem } = require('../utils/firebase');
const { generatePin } = require('../utils/auth');
const argon2 = require('argon2');
const { error } = require('console');
const { networkInterfaces } = require('os');
const exp = require('constants');

exports.connect = async function (req, res) {
    const { phone } = req.body;
    if (!phone) {
        res.status(400).json({ message: 'Error, phone number is invalid or not registered'})
    } else {
        if(!validate.phoneNumber(phone))  {
            res.status(400).json({ message: 'Error, phone number is invalid or not registered' })              
        } else {
            const result = await generatePin();
            item = await setItem('clients', 'phone', phone, 'hash', result.hash)
            console.log(item)
            if(!item) {
                res.status(200).json({ message: 'Success', pin: result.pin})
            }  else {
                res.status(400).json({ message: 'Error, phone number is invalid or not registered' })
            }
            var currentTime = Date.now();   
            var expiryTime = currentTime + 60;     
            setItem('clients', 'phone', phone, 'hashExpiry', expiryTime)
        }            
    }

firebase.js

const { on } = require("events");
var admin = require("firebase-admin");
// Import Admin SDK
const { getDatabase } = require('firebase-admin/database');
const { type } = require("os");

var serviceAccount = require("../fedex-3a42e-firebase-adminsdk-r96f1-7249eaf87b.json");
admin.initializeApp({
    credential: admin.credential.cert(serviceAccount),
    databaseURL: "https://fedex-3a42e-default-rtdb.firebaseio.com/"
});

const db = getDatabase()

function getItem(itemRef, child, val) {
    const dbRef = db.ref(itemRef);    
    dbRef.orderByChild(child).equalTo(val).on("value", (data) => {
        return data.val();       
    }); 
}

async function setItem(itemRef, child, val, key, pushedVal) {
    const value = await getItem(itemRef, child, val);
    console.log('val', value)
    if(value) {
        finallySetItem(value, itemRef, pushedVal);
        return true
    } else  {
        return false
    }         
}

function finallySetItem(data, itemRef, pushedVal) {
    console.log(data)
    if(data) {
        var itemKey = Object.keys(data)[0];
        console.log(itemKey)
        const dbRef = db.ref(itemRef + '/' + itemKey +  '/' + key);
        dbRef.set(pushedVal);        
    }
}

module.exports = { getItem, setItem }

这行不通:

function getItem(itemRef, child, val) {
    const dbRef = db.ref(itemRef);    
    dbRef.orderByChild(child).equalTo(val).on("value", (data) => {
        return data.val();       
    }); 
}

您正在将回调传递给 on()on() 不会对其中 return 的值执行任何操作。

您更有可能想使用 once() 和 return 异步的值:

async function getItem(itemRef, child, val) {
    const dbRef = db.ref(itemRef);    
    const data = await dbRef.orderByChild(child).equalTo(val).once("value");
    return data.val();       
}