【问题标题】:Unable to get mysql count in node.js route无法在 node.js 路由中获取 mysql 计数
【发布时间】:2021-12-31 00:05:19
【问题描述】:

我是 node.js 的新手,目前正在开发演示项目,所以我的要求是获取我通过函数调用的 userId 的计数,并且此函数在路由之外声明,但我得到未定义但在同一个函数中获取计数值,但是当我返回计数时,路由中仍然未定义。

代码:

var express = require('express');
var router = express.Router();

router.get('/', function(req, res, next) {      
    const usersQuery = "SELECT * FROM users";
    dbConn.query(usersQuery,function(err,rows)     {
        if(err) {
            console.log('this error',res);
        } else {
            let total=getCount();   // calling function placed outside
            console.log(total);
            }
        
        });
    });

函数在外部声明返回计数:

function getCount(){
    const usersQuery = "SELECT count(id) as cnt FROM users";
    dbConn.query(usersQuery,function(err,rows)     {
        if(err) {
            console.log('failed  to get count');
        } else {
            return rows; // retun count 
          
            }
    })
}

【问题讨论】:

    标签: javascript mysql node.js express


    【解决方案1】:

    你需要返回query的结果

    function getCount(){
        const usersQuery = "SELECT count(id) as cnt FROM users";
        return dbConn.query(usersQuery,function(err,rows)     {
            if(err) {
                console.log('failed  to get count');
            } else {
                return rows; // retun count
            }
        })
    }
    

    请注意,可能会返回您需要正确处理的Promise

    【讨论】:

    • 您的getCount 没有返回任何内容。这就是为什么totallet total=getCount(); 之后未定义的原因。注意答案中第 3 行的return,它返回调用query 的结果。在您的代码库中尝试一下,看看是否/发生了什么变化。
    • 根据我的经验,这只是我的一些猜测。如果一切正常,请忽略它。我猜dbConn.query 返回一个Promise,因此您可能需要在Promise 上调用then 或在Promise 上调用await。使用Promise 是它自己的主题。如果您需要或想了解更多有关它的信息,您可以在 Google 上搜索很多资源,或者直接在 SO 上搜索。
    • 对不起,它不起作用
    • 我注意到其他控制台输出,所以我认为它工作正常,但不幸的是它返回的是查询错误对象而不是计数结果。
    • 好的。你遇到了什么错误?
    【解决方案2】:

    最后我在 node js 中使用 Promise() 得到了所需的输出

    代码:

    var express = require('express');
    var router = express.Router();
    
    router.get('/', function(req, res, next) {      
        const Query = "SELECT * FROM t1";
        dbConn.query(Query,function(err,rows)     {
            if(err) {
                // write some code
            } else {
    // call to promise
                  getData().then(function (outputVal) {
                    console.log(outputVal[0].Usr);
                }).catch(function () {
                    // write error here
                });
            }
        
        });
    });
    

    // 承诺代码

    function getData() {
        return new Promise(function (resolve, reject) {
            //  setTimeout(function () {
            const MQuery = "SELECT count(id) as Usr FROM t2";
            dbConn.query(MQuery , function (err, rows) {
                if (err) {
                    reject();
                } else {
                    resolve(rows);
                }
                // }, 1000);
            })
        })
    }
    

    【讨论】:

      【解决方案3】:

      你应该知道的几件事:

      1. 一旦服务器启动,即使您尚未调用特定路由,在路由外部声明的函数也会首先在堆栈中执行。当您调用此函数时,它已经包含undefinednull,具体取决于函数内部的代码。
      2. dbConn.query() 是承诺。这意味着它可以同步工作。

      如果您需要用户数量,您可以执行以下操作:

      router.get('/', function(req, res, next) {      
          const usersQuery = "SELECT * FROM users";
          dbConn.query(usersQuery,function(err,rows)     {
              if(err) {
                  console.log('this error',res);
              } else {
                  let total= rows.length // you will get an array of users, therefore the number of users is equal to the length of the array
                  console.log(total);
              }
              
         });
      });
      

      【讨论】:

        猜你喜欢
        • 2021-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-24
        • 2016-06-12
        • 2017-12-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多