我正在完成我的简单应用程序,允许注册用户,然后登录到商店。注册部分已经完成,我已经可以将新的集合和文档放入外部mongoDB集群中。
我被卡在登录部分了。让我给你看看密码。
下面是检查我的mongoDB集合是否存在特定用户的函数。如果存在,则将userExists设置为True。是全局变量。我想这不是很好,但是我不能把这个变量放在函数中。另外,我要指出的是,这个查找函数工作得很好,它真的返回true或false,这取决于用户是否存在。
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(‘/app.post’)中显示app.post时,它只在第二次尝试登录后才会显示null,因为在app.post('/ login ')中的任何代码都比checkUser()函数执行得更快。我必须从全局变量userExists (‘/login’)中立即访问它,因为稍后在fetch响应中需要它。我想问题在于那里的情况是异步的。老实说,我不确定我对异步/等待的理解是否足够好。稍后我会更深入地研究它,但是现在我想了解为什么它是这样工作的。
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...');
})发布于 2020-11-18 16:44:01
这是因为您的'checkUser‘函数是一个异步函数,所以程序执行在调用它之后继续执行,最终得到的是userExist的空值。您可以通过这样的方式修复它:
async function checkUser(userData) {
await dbConnect();
var content=await _db.db('blackmarket').collection('users').find().toArray();
const foundUser = await content.find(singleuser => singleuser.login === userData.login && singleuser.password === userData.password)
if (foundUser) {
console.log(foundUser);
return true;
} else if (!foundUser) {
console.log(foundUser);
return false;
}
}此外,您也不需要一个全局变量来实现这一点。更改您的调用函数如下:
app.post('/login',async (req, res) => {
try{
var userExist=await checkUser(req.body);
//here I want to attach userExists value to response(later)
console.log(userExists)
res.end();
}
catch(error){
console.log(error)
}
})还有一个建议--在将用户密码存储在数据库中之前先加密它,而不是直接存储它。
https://stackoverflow.com/questions/64897132
复制相似问题