【发布时间】:2020-11-18 16:24:16
【问题描述】:
我正在完成我的简单应用程序,该应用程序允许注册用户然后登录到商店。注册部分已经完成,我已经可以将新的集合和文档放入外部的 mongoDB 集群了。
我在登录部分卡住了。让我给你看代码。
如果存在特定用户,这是检查我的 mongoDB 集合的函数。如果存在,则将 userExists 设置为 True。 是全局变量。我想这不好,但我不能把那个变量放在函数中。另外我想指出,这个查找函数运行良好,它返回真或假取决于用户是否存在。
async function checkUser(userData) {
await dbConnect();
await _db.db('blackmarket').collection('users').find().toArray(async (err, content) => {
const foundUser = await content.find(singleuser => singleuser.login === userData.login && singleuser.password === userData.password)
if (foundUser) {
usersExists = await true
console.log(userExists); // if exists it will display true in console, but later than the same value from *app.post('/login')*
} else if (!foundUser) {
usersExists = await false;
console.log(userExists);
}
})
}
这里是 express.js 代码。当我尝试在 app.post('/login') 中显示 userExists 时,它显示 null,只有在第二次登录尝试后它才返回 true,因为 app.post(' 中的任何代码/login') 的执行速度比 checkUser() 函数快。我必须能够从 app.post('/login') 即时访问那个 全局变量 userExists,因为我稍后会在我的 fetch 响应中需要它。我想问题在于那里发生的事情的异步性质。老实说,我不确定我对 async/await 的理解是否足够好。我稍后会更深入地研究它,但至于现在我想了解它为什么会这样。
const app = express();
app.use(express.json())
app.use(express.urlencoded({
extended: true
}))
app.use(express.static('static'))
app.post('/register', (req, res) => {
registerUser(req.body).catch(console.error);
res.end();
})
app.post('/login', (req, res) => {
checkUser(req.body).catch(console.error)
//here I want to attach userExists value to response(later)
console.log(userExists) - here it displays null
res.end();
})
app.listen(process.env.PORT || 5000, () => {
console.log('running...');
})
【问题讨论】:
标签: javascript node.js mongodb express