【问题标题】:Variable value remains unchanged after running multiple queries in Node JS在 Node JS 中运行多个查询后变量值保持不变
【发布时间】:2022-01-19 14:55:42
【问题描述】:

我正在尝试检查具有给定电子邮件 ID 的用户是否以前注册过。如果是,则将名为uniqueUser 的变量设置为false。但是,即使条件为true,此变量也保持不变。它的值在本地发生变化,但是一旦 promise 被解决,值就会恢复到之前的值。

这里是代码:-

router.post('/register-user', multer_profile_pic.any(), (req, res, next) => {
   
    var uniqueUser = true; //----> This value is being focused
    const user = req.body;
   
    
    var query = `SELECT * FROM users WHERE email=$1`;
  
    var values = [user.email];

   db.query(query,values)
            .then(result => {
                if(result.rowCount > 0) {
                    uniqueUser = false;
                    console.log("uniqueUser="+uniqueUser); //----> Here value becomes false
                   
                }
                
            })
            .catch(err => {
                
                uniqueUser=false;
            });
    
   
    if(uniqueUser) {
        console.log(uniqueUser); //----> Here value becomes true
      //INSERT QUERY HERE
    }
    
    const josn_resp = {
        response: response,
        message:message
    }
    res.json(josn_resp);
});

【问题讨论】:

    标签: node.js postgresql


    【解决方案1】:

    出现这个问题是因为你不了解 Promise 事件循环是如何工作的。

    在您的代码中 db.query(query,values)if(uniqueUser) { 在事件循环中同时执行,实际上您的变量 uniqueUser 从未改变。

    你应该像下面这样改变你的代码:

    router.post('/register-user', multer_profile_pic.any(), (req, res, next) => {
    
      var uniqueUser = true; //----> This value is being focused
      const user = req.body;
    
    
      var query = `SELECT * FROM users WHERE email=$1`;
    
      var values = [user.email];
    
      db.query(query, values)
        .then(result => {
          if (result.rowCount > 0) {
            uniqueUser = false;
            console.log('uniqueUser=' + uniqueUser); //----> Here value becomes false
          }
    
          if (uniqueUser) {
            console.log(uniqueUser); //----> Here value becomes true
            //INSERT QUERY HERE
    
            return db.query('insert-query');
          }
    
          return Promise.resolve();
        })
        .then(() => {
          const josn_resp = {
            response: response,
            message: message,
          };
    
          res.json(josn_resp);
        })
        .catch(err => {
          res.status(400);
          res.json({message: err.message})
        });
    });
    

    如果你使用 nodeJs 12 及以上版本我建议使用async/await:

    router.post('/register-user', multer_profile_pic.any(), async (req, res, next) => {
      const user = req.body;
    
      try {
        const result = await db.query(`SELECT * FROM users WHERE email=$1`, [user.email]);
        if (result.rowCount === 0) {
          await db.query('insert-query');
        }
    
        const josn_resp = {
          response: response,
          message: message,
        };
    
        res.json(josn_resp);
      } catch (err) {
        res.status(400);
        res.json({message: err.message})
      }
    });
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-09
    • 1970-01-01
    • 1970-01-01
    • 2015-08-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多