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



我检查了大量类似的问题——所有数据,我很困惑。无论电话号码是否在数据库中,这都会返回相同的结果。其他带有async和promise的版本已经导致应用程序崩溃。请帮助

如何使用adminSDK从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()不会对您在其中返回的值执行任何操作。

更有可能您希望使用once()并从那里异步返回值:

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

最新更新