Javascript 如何在app.post函数中使用外部服务器的值

Javascript 如何在app.post函数中使用外部服务器的值,javascript,node.js,mongodb,express,Javascript,Node.js,Mongodb,Express,我正在完成我的简单应用程序,它允许注册用户,然后登录商店。注册部分已经完成,我已经可以将新的集合和文档放入外部mongoDB集群 我在登录部分被卡住了。让我给你看看代码 下面是检查我的mongoDB集合是否存在特定用户的函数。如果存在,则将userExists设置为True它是全局变量。我想这不好,但我不能把变量放在函数中。我还想指出,这个查找函数工作得很好,它确实返回true或false,这取决于用户是否存在 async function checkUser(userData) { a

我正在完成我的简单应用程序,它允许注册用户,然后登录商店。注册部分已经完成,我已经可以将新的集合和文档放入外部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('/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()。