我几乎只使用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
};
答案 0 :(得分:1)
我已经删除了全局变量assetCount
,skuCount
,并采用了不同的方法来解决您的所有问题。此解决方案需要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);