如何仅在循环(其中包含函数)完成时运行语句?
Posted
技术标签:
【中文标题】如何仅在循环(其中包含函数)完成时运行语句?【英文标题】:How to run a statement only when the loop (with functions inside it) have completed? 【发布时间】:2020-11-29 10:50:10 【问题描述】:这是我的代码。
router.route("/login").post((req, res) =>
const email = req.body.email;
const password = req.body.password;
Account.find().then((account) =>
account.forEach((eachAcc) =>
if (eachAcc.email.toUpperCase() === email.toUpperCase())
bcrypt.compare(password, eachAcc.password, function (err, result)
if (result == true) res.status(200).json("Login Successful");
else if (err) res.status(400).json("Error: " + err);
);
);
res.status(400).json("Invalid email or password");
);
);
但我总是收到无效的电子邮件/密码,我希望仅在循环完成且电子邮件/密码不匹配时打印它。
请帮忙。
【问题讨论】:
只有在至少有一个错误 400 状态时才应该显示无效的电子邮件/密码? 避免使用if (result == true)
,要么使用if (result)
,要么使用if (result === true)
。 ***.com/a/15394130/6451036
你在这里使用Account.find()
的目的是什么?您需要一个函数作为参数来测试一个值。根据我的理解,不带参数调用它不会返回任何内容。 developer.mozilla.org/en-US/docs/Web/javascript/Reference/…
@Sascha 是的错误消息应该显示至少一个错误
@Aroic here Accound.find() 是一个猫鼬查询,用于查找我的数据库中的所有帐户。 mongoosejs.com/docs/api.html#model_Model.find
【参考方案1】:
试试这个
router.route("/login").post((req, res) =>
const email, password = req.body;
Account.find().then((account) =>
let acc = account.find(
(eachAcc) => eachAcc.email.toUpperCase() ===
email.toUpperCase()
);
if (acc)
bcrypt.compare(password, acc.password, function (err, result)
if (err) res.status(400).json("Error: " + err);
else if (result) res.status(200).json("Login Successful");
else res.status(400).json("Invalid password");
);
else res.status(400).json("Invalid email");
);
);
【讨论】:
【参考方案2】:您可以为此 setTimeout(()=>//code here,300) 使用 setTimeout 函数。
【讨论】:
在这些情况下切勿使用 setTimeout。 如果他必须等待一段时间才能获取数据,那将是非常糟糕的用户体验【参考方案3】:希望对你有帮助:
router.route("/login").post((req, res) =>
const email, password = req.body;
Account.find().then((accounts) =>
let match = false;
for (acct of accounts)
if (acct.email.toUpperCase() !== email.toUpperCase()) continue;
bcrypt.compare(password, acct.password, (err, result) =>
if (err)
res.status(400).json("Error: " + err);
break;
res.status(200).json("Login Successful");
match = true;
break;
);
if (!match) res.status(400).json("Invalid email or password");
);
);
【讨论】:
我会试试这个。谢谢 它不起作用,我总是得到 Invalid email/password @sandy 你确定你的用户名和密码正确并且与bcrypt.compare()
函数匹配吗?以上是关于如何仅在循环(其中包含函数)完成时运行语句?的主要内容,如果未能解决你的问题,请参考以下文章
只有在 SwiftUI 和 Firebase 中完成循环中的异步调用时,如何才能返回函数?