首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在app.post函数中使用外部服务器的值

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

Stack Overflow用户
提问于 2020-11-18 16:24:16
回答 1查看 37关注 0票数 1

我正在完成我的简单应用程序,允许注册用户,然后登录到商店。注册部分已经完成,我已经可以将新的集合和文档放入外部mongoDB集群中。

我被卡在登录部分了。让我给你看看密码。

下面是检查我的mongoDB集合是否存在特定用户的函数。如果存在,则将userExists设置为True。是全局变量。我想这不是很好,但是我不能把这个变量放在函数中。另外,我要指出的是,这个查找函数工作得很好,它真的返回true或false,这取决于用户是否存在。

代码语言:javascript
复制
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响应中需要它。我想问题在于那里的情况是异步的。老实说,我不确定我对异步/等待的理解是否足够好。稍后我会更深入地研究它,但是现在我想了解为什么它是这样工作的。

代码语言:javascript
复制
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...');
})
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-18 16:44:01

这是因为您的'checkUser‘函数是一个异步函数,所以程序执行在调用它之后继续执行,最终得到的是userExist的空值。您可以通过这样的方式修复它:

代码语言:javascript
复制
   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;
    }

}

此外,您也不需要一个全局变量来实现这一点。更改您的调用函数如下:

代码语言:javascript
复制
      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)
         }

      })

还有一个建议--在将用户密码存储在数据库中之前先加密它,而不是直接存储它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64897132

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档