【问题标题】:How do I use values from external server in app.post function如何在 app.post 函数中使用来自外部服务器的值
【发布时间】: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


    【解决方案1】:

    发生这种情况是因为您的“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 is not a function now :( EDIT :It works ! 你刚刚忘记了内容声明中的 toArray() 方法
    • 现在就试试吧。我在内容调用后添加了 .toArray()。
    猜你喜欢
    • 2021-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-13
    • 2018-05-03
    • 2012-12-01
    • 1970-01-01
    • 2013-06-09
    相关资源
    最近更新 更多