mysql - 如何简化node js查询中的嵌套if循环

标签 mysql node.js

我需要简化下面的嵌套 if 循环代码。如何在 Node.js 中进行操作。 我还需要在 jscript 本身中进行基于用户的查询调用,而不是在 ejs 中进行编码。如何使用node js在图表中显示表格数据。 morris js 图表是否与 Node js 兼容。如果是这样,如何从渲染函数的 Node js 对象中将数据解析为 json。

var moment = require('moment');
var currencyFormatter = require('currency-formatter');
var db = require('./db.js');

const siteTitle = "SalesFlow | Luftek";
const mainURL = "http://sales.luftek.in/";

var dquery = "SELECT COUNT(*) as pending FROM enquiries WHERE status = 'Processing';";
var listdquery = "SELECT * FROM enquiries WHERE status = 'Processing';";
var listsquery = "SELECT * FROM salesorder_b WHERE po_date >= NOW()- INTERVAL 14 DAY;";
var dsquery = "SELECT count(*) as recent_order FROM salesorder_b WHERE po_date >= NOW()- INTERVAL 14 DAY";
var hitratio = "SELECT ((SELECT (SELECT count(*) FROM enquiries WHERE job_ref = (SELECT job_ref FROM salesorder_b where enquiries.job_ref = salesorder_b.job_ref) ) / (SELECT count(*) FROM enquiries))) * 100 as hitratio;";
var hitratioazeem = "SELECT ((SELECT (SELECT count(*) FROM enquiries WHERE job_ref = (SELECT job_ref FROM salesorder_b where enquiries.job_ref = salesorder_b.job_ref) & sales_per = 'Azeem' ) / (SELECT count(*) FROM enquiries where sales_per = 'Azeem'))) * 100 as hitratioazeem;";
var hitratiosuresh = "SELECT ((SELECT (SELECT count(*) FROM enquiries WHERE job_ref = (SELECT job_ref FROM salesorder_b where enquiries.job_ref = salesorder_b.job_ref) & sales_per = 'Suresh M' ) / (SELECT count(*) FROM enquiries where sales_per = 'Suresh M'))) * 100 as hitratiosuresh;";
var azeempendingenquiry = "SELECT COUNT(*) as pending FROM enquiries WHERE status = 'Processing' && sales_per = 'Azeem';";
var hitratiochart = "SELECT * FROM hitratio;";

exports.dboard = function (req, res) {

  if (req.user) {
    db.query(hitratio, function (err, hitresult) {
      if (err) { throw err; }
      else {
        db.query(dsquery, function (err, result1) {
          if (err) { throw err; }
          else {
            db.query(listdquery, function (err, plistresult) {
              if (err) { throw err; }
              else {
                db.query(listsquery, function (err, olistresult) {
                  if (err) { throw err; }
                  else {
                    db.query(dquery, function (err, result) {                
                      if (err) throw err;
                      else {
                        db.query(hitratioazeem, function (err, hitresultazeem) {
                          if (err) throw err;
                          else{
                            db.query(hitratiosuresh, function (err, hitresultsuresh) {
                              if (err) throw err;
                              else{
                                db.query(hitratiochart, function (err, hitresultchart) {
                                  if (err) throw err;
                                  else{
                                    res.render('pages/dashboard', {
                                      siteTitle: siteTitle,
                                      moment: moment,
                                      currencyFormatter: currencyFormatter,
                                      pageTitle: "Dashboard",
                                      hitresult1: hitresult[0],
                                      hitresult2: hitresultazeem[0],
                                      hitresult3: hitresultsuresh[0],
                                      sales: result1[0].recent_order,
                                      items: result[0].pending,
                                      hititems : hitresultchart,
                                      plists: plistresult,
                                      olists: olistresult,
                                      user: req.user
                                    });
                                  }
                                });
                              }
                            });
                          } 
                        });
                      }
                    })
                  }
                });
              }
            });
          }
        });
      }
    });
  }
  else { res.redirect(mainURL); }

}

最佳答案

“嵌套 if 循环”通常被称为“回调 hell ”,并且有各种实用程序包可以处理此问题。一种流行的方法是 async,它为这一特定用例提供 async.parallel:

async.parallel([
  (callback) => db.query(query1, callback),
  (callback) => db.query(query2, callback), 
  (callback) => db.query(query3, callback), 
], (err, results) => {
  if (err) throw err;

  res.render('pages/dashboard', {
    data1: results[0],
    data2: results[1],
    data3: results[2],
  }) 
})

要“渲染”JSON,请查看 Express 的 res.json

对于“基于用户的查询调用”,我不太明白您所指的内容。如果您正在谈论动态构建 SQL 查询,我会推荐一个包,例如 knex

关于mysql - 如何简化node js查询中的嵌套if循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51441035/

相关文章:

查询 IS NULL 时 MySQL 返回最后插入

php - Laravel 4.2 Eloquent 关系

javascript - 在 javascript 服务器端连接 MySQL,无需使用 Node.js

php - 将从 db 获取的值存储在变量中

node.js - 我应该将 res.render 或 res.redirect 与 Express 和 EJS 一起使用吗?

node.js - 在Docker中安装 Node v8

node.js - 你能定义任务优先级吗?

mysql - Hadoop mysql限制reducers

http - 在负载测试下,Node.js Http.request变慢了。难道我做错了什么?

javascript - 如何在 Node.js 中打印堆栈跟踪?