Javascript 如何在app.post函数中使用外部服务器的值
我正在完成我的简单应用程序,它允许注册用户,然后登录商店。注册部分已经完成,我已经可以将新的集合和文档放入外部mongoDB集群 我在登录部分被卡住了。让我给你看看代码 下面是检查我的mongoDB集合是否存在特定用户的函数。如果存在,则将userExists设置为True它是全局变量。我想这不好,但我不能把变量放在函数中。我还想指出,这个查找函数工作得很好,它确实返回true或false,这取决于用户是否存在Javascript 如何在app.post函数中使用外部服务器的值,javascript,node.js,mongodb,express,Javascript,Node.js,Mongodb,Express,我正在完成我的简单应用程序,它允许注册用户,然后登录商店。注册部分已经完成,我已经可以将新的集合和文档放入外部mongoDB集群 我在登录部分被卡住了。让我给你看看代码 下面是检查我的mongoDB集合是否存在特定用户的函数。如果存在,则将userExists设置为True它是全局变量。我想这不好,但我不能把变量放在函数中。我还想指出,这个查找函数工作得很好,它确实返回true或false,这取决于用户是否存在 async function checkUser(userData) { a
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,因为我以后在获取响应中需要它。我想问题在于发生的事情的异步性。老实说,我不确定我对异步/等待的理解是否足够好。稍后我会更深入地研究它,但现在我想了解它为什么会这样工作
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...');
})
之所以会发生这种情况,是因为“checkUser”函数是一个异步函数,因此程序在调用它之后会继续执行,最终会得到userExist的null值。您可以通过以下方式进行修复:
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)
}
})
还有一个建议-在将用户密码存储到数据库中之前对其进行加密,而不是直接存储。它返回TypeError:content.find现在不是一个函数:(编辑:它可以工作!您刚刚忘记了content Declaration中的toArray()方法立即尝试。我在调用content之后添加了.toArray()。