node.js - 异步函数执行顺序错误
问题描述
我正在尝试在 nodejs 中编写一个函数,该函数从 json 文件中读取有关用户的信息(我知道这不安全,只是一个练习),记录详细信息是否正确并发送响应。我写了这个异步函数:
async function getUser(sUsername) {
fs.readFile('db/users.json', (err, data) => {
if (err) {
console.log(`An error has occured in getUser function`)
}
let users = JSON.parse(data)
userNamesFromFile = Object.keys(users);
console.log(`Data is: ${data}`)
console.log(`Users after parsing are: ${userNamesFromFile}\n`)
for (currUser in userNamesFromFile) {
`Currently checking comparing to user: ${currUser}\n`
if (currUser === sUsername) {
var oUser = new User(currUser, users[currUser].password);
return oUser;
}
}
})
}
我在这里称它为:
getUser(oBody.username.toLowerCase()).then(oFoundUser => {
console.log(`Finished the async function, found user ${oFoundUser}`)
if (oFoundUser) {
if (oBody.password.toString() === oFoundUser.password.toString()) {
console.log("Login successful")
res.statusCode = 200
req.session.username = oFoundUser.username;
}
else {
console.log("Wrong password")
res.statusCode = 401;
}
}
else {
res.statusCode = 401
console.log("No user with such a name exists")
}
res.send();
})
这是我在输入用户的正确详细信息时从服务器获得的日志:
Finished the async function, found user undefined
No user with such a name exists
POST /login 401 7.822 ms - -
Data is: {
"testuser1": {
"password": 12345
},
"testuser2": {
"password": 6789
}
}
Users after parsing are: testuser1, testuser2
看起来他是在说异步函数运行,然后才记录我从异步函数记录的信息。它甚至没有进入将用户与我刚刚从我的 json 文件中获得的内容进行比较的循环。我将我想要对异步函数的返回值做的事情放在 .then 中。它不应该按照我期望的顺序运行吗?
谢谢,
本
解决方案
我找到了解决方案。我想使用回调是正确的答案。如果我理解正确,异步函数不会返回解析为我给它的“返回”值的承诺,但我可以在异步函数的解析中调用复出。这个对吗?
async function getUser(sUsername, callback) {
return fs.readFile('db/users.json', (err, data) => {
if (err) {
console.log(`An error has occured in getUser function`)
}
let users = JSON.parse(data)
userNamesFromFile = Array.from(Object.keys(users));
for (let i = 0; i < userNamesFromFile.length; i++) {
currUser = userNamesFromFile[i]
if (currUser === sUsername) {
var oUser = new User(currUser, users[currUser].password);
console.log(`Returnign callback with ${oUser.toString()}` )
return callback(oUser);
}
if (i === userNamesFromFile.length - 1) {
return callback(false)
}
}
})
}
getUser(oBody.username.toLowerCase(), oFoundUser => {
console.log(`Finished the async function, found user ${oFoundUser}`)
if (oFoundUser) {
if (oBody.password.toString() === oFoundUser.password.toString()) {
console.log("Login successful")
res.statusCode = 200
req.session.username = oFoundUser.username;
}
else {
console.log("Wrong password")
res.statusCode = 401;
}
}
else {
res.statusCode = 401
console.log("No user with such a name exists")
}
res.send();
})
谢谢,
本
推荐阅读
- ios - 没有自我的自动释放池访问方法中的 Swift 闭包
- regex - 单击赛普拉斯中的完全匹配文本
- reactjs - 多个输入上的单个模糊事件
- python - 将字典转换为 Python 数据框
- xamarin - 如何为 RelativeLayout ConstraintExpression 编写 OnPlatform 代码
- java - 确保模拟调用时条件返回 false
- css - 如何简化引导菜单?
- javascript - 使用 Puppeteer 重新加载 Jest 后检查页面内容
- c# - asp.net css 在我的本地机器和远程机器上是不同的
- java - MediaCodec和MediaExtractor的理解