使用两个单独的查询node.js的结果进行数学运算

时间:2017-01-09 01:19:06

标签: node.js asynchronous callback

我几乎只使用Python编程,但我正在尝试学习Node。我的思绪一直处于同步状态,以至于我正在拼写单词,并试图找出回调来撞墙。我意识到回调函数是传递给函数的函数吗?我已成功编写了非常简单的回调,但无法按照我喜欢的方式使用此代码。

基本上,我需要将这两个查询的结果相乘,然后我将根据该数学编写一个if语句。

希望有人能告诉我如何编写一个调用这些函数的函数,等待结果,将它们相乘,并包含一个if语句让我做一些事情。

这需要通过节点完成,因为我将其添加到使用节点开发的聊天机器人。

var getSkuCount = function() {
pool.getConnection(function(err, connection) {
    connection.query("select count(sku) from products_per_store where store_id = " + sID + " group by store_id", function (err, record) {
        if (err) {
            console.error('DATABASE ERROR:', err);
        }
        return record
        connection.release();
        });
    });
};


var getAssetCount = function () {
console.log("getting total of scrapers attached to " + store_id);
pool.getConnection(function(err, connection) {
    connection.query("SELECT count(*) FROM external_crawl_settings WHERE store_id = " + sID + " group by store_id", function (err, record) {
        if (err) {
            console.log(err);
            return console.error('DATABASE ERROR:', err);
        }
        connection.release();
        });
    });
}

var skuCount = getSkuCount();
var assetCount = getAssetCount();

if skuCount * assetCount > 50000 {
do something
};

2 个答案:

答案 0 :(得分:1)

我已经删除了全局变量assetCountskuCount,并采用了不同的方法来解决您的所有问题。此解决方案需要2个不同的文件1用于管理连接,1用于合并所有路由。

您需要在应用的index.js或类似服务器启动脚本中使用此功能。

app-server.js //服务器启动文件

'use strict';

let express = require('express');
let connectionManager = require('./connection-manager');

//read from your config file
let config = {
  port: 7007,
  host: 'host',
  user: 'user',
  password: 'password',
  database: 'database',
  connectionLimit: 'limit'
};

function startServer(config) {
  let application = require('../'); // your application with all the routes
  server = http.createServer(application);
  return new Promise((resolve, reject) => {
    server.listen(config.port, ()=> {
      return resolve();
    }).on('error', (err)=> {
      return reject(err);
    });
  });
}

connectionManager.init(config).then(()=> {
  return startServer(config);
}).then(()=> {
  console.log(`server is up at ${config.port}`);
}).catch((err) => {
  console.log('err while starting server', err.stack);
});

connection-manager.js //连接管理器

'use strict';

let mysql = require('promise-mysql');

let connectionPool;

class Connections {

  static init(config) {
    return mysql.createPool({
      host: config.host,
      user: config.user,
      password: config.password,
      database: config.database,
      connectionLimit: config.limit
    }).getConnection().then((connection)=> {
      connectionPool = connection;
    });
  }

  static getConnection() {
    // you can call this across your applications
    return connectionPool; 
  }

  static releaseConnection() {
    //call this only if you want to shut the application
    connectionPool.close(); // or equivalent method available 
  }

}

module.exports = Connections;

<强> sample.js

'use strict';

let connection  = require('./connection-manager').getConnection();

function compute(sid) {
  let skuCount = connection.query('select count(sku) "cnt"  from products_per_store where store_id = ' + sID + ' group by store_id');
  let assetCount = connection.query('SELECT count(*) "cnt" FROM external_crawl_settings WHERE store_id = ' + sID + ' group by store_id');

  return Promise.all([
    skuCount,
    assetCount
  ]).then((results)=> {
    let skuCount = results[0];
    let assetCount = results[1];
    if (skuCount * assetCount > 50000) {
      //do something
    }
  }).catch((err) => {
    console.log('DATABASE ERROR:', err.stack);
  });
}
  

此外,您可以拥有多少个开放式连接?

由于连接池会为您处理连接回收,因此它取决于您拥有的硬件资源。但我可以建议你从默认值开始,并继续增加,直到你得到你想要的性能。

  

我的slack-bot随机崩溃,我无法弄清楚原因。

您是否使用pm2等流程管理器? 。如果是这样,只有在看到它时,才能帮助您进一步调试它。进程管理器会跟踪所有异常,因为他们正在管理应用程序,所以可以正常获得错误。

  

程序是否仅在未被捕获的错误时结束?

是。如果您尚未处理process.on(uncaughtException)process.on(unhandledRejections)。让good practice in node.js land。{/ p>是the program crash and restart

  

我的僵尸程序是否会达到连接限制并崩溃?

不能说出来。但是,通过检查日志中的/var/log/mysql/error.log错误堆栈跟踪,pm2日志,可以获得更多线索。

  

如何释放连接?

如果您使用任何连接池,则不必如此。

答案 1 :(得分:0)

mBackgroundRectF.set(0, 0, mWidth, mHeight);
canvas.drawRoundRect(mBackgroundRectF, mRadius, mRadius, mBackgroundPaint);
// edge ajustment because paint stroke style is center align
float edge = mBorderWidth / 2;
mBackgroundRectF.set(edge, edge, mWidth - edge, mHeight - edge);
// use CornerPathEffect and then use drawRect() method
mBorderPaint.setPathEffect(new CornerPathEffect(mRadius / 2));
canvas.drawRect(mBackgroundRectF, mBorderPaint);