Javascript NodeJS子进程无法访问MySQL池对象
我的意图是在上传文件时,main Node.JS Express后端进程将派生一个子进程,该子进程将调用java程序来解析上传的文件,然后NodeJS子进程将进行批量(100K+)MySQL查询。我希望子进程处理查询,因为我不希望父进程“阻塞”。因为父进程和子进程都需要访问MySQL连接,所以我在包含Javascript NodeJS子进程无法访问MySQL池对象,javascript,node.js,express,child-process,mysql-connector,Javascript,Node.js,Express,Child Process,Mysql Connector,我的意图是在上传文件时,main Node.JS Express后端进程将派生一个子进程,该子进程将调用java程序来解析上传的文件,然后NodeJS子进程将进行批量(100K+)MySQL查询。我希望子进程处理查询,因为我不希望父进程“阻塞”。因为父进程和子进程都需要访问MySQL连接,所以我在包含npm MySQL池的外部文件中定义了该连接 mysqlConnector.js: // Load module var mysql = require('mysql'); // Initializ
npm MySQL
池的外部文件中定义了该连接
mysqlConnector.js:
// Load module
var mysql = require('mysql');
// Initialize pool
var pool = mysql.createPool({
connectionLimit : 10,
host : 'localhost',
port: 3306,
user: 'bob',
password: 'my_pass',
database: 'my_db'
});
const doQuery = (query_string) => {
console.log(pool);
pool.query(query_string, function (error, results, fields) {
if (error) throw error;
console.log('in doQuery: query' );
});
};
exports.doQuery = doQuery;
exports.pool = pool
const {execSync, fork} = require('child_process');
const {doQuery} = require('../mysqlConnector');
const exec_options = {
cwd: null,
env: null,
encoding: 'utf8',
timeout: 0,
maxBuffer: 200 * 1024,
killSignal: 'SIGTERM'
};
process.on('message', msg=>{
if(msg.filepath && msg.username){
execSync(`java -jar C:\\Users\\colli\\d2reader\\out\\artifacts\\d2reader_jar\\d2reader.jar ${msg.filepath}`, exec_options);
var filename = msg.filepath.replace(/^.*[\\\/]/, '');
filename = __dirname + "\\json\\" + filename.substring(0, filename.length-3) + "json";
try{
const fs = require('fs');
const data = fs.readFileSync(filename, 'utf8');
processSharedStashQueries(JSON.parse(data), msg.username);
} catch(err) {
console.error(err);
}
process.exit();
}
});
const processSharedStashQueries = (data, username) => {
const INSERT_USER_QUERY = `insert into sharedstashes (NumStashes, SharedGold, NumItems, UserID) values (${data.numStashes}, ${data.sharedGold}, ${data.numItems}, (select id from users where username = '${username}'))`;
doQuery(INSERT_USER_QUERY);
};
My index.js(主进程)能够访问此池并进行无问题查询。主进程将派生运行以下代码的子进程
handleprops.js:
// Load module
var mysql = require('mysql');
// Initialize pool
var pool = mysql.createPool({
connectionLimit : 10,
host : 'localhost',
port: 3306,
user: 'bob',
password: 'my_pass',
database: 'my_db'
});
const doQuery = (query_string) => {
console.log(pool);
pool.query(query_string, function (error, results, fields) {
if (error) throw error;
console.log('in doQuery: query' );
});
};
exports.doQuery = doQuery;
exports.pool = pool
const {execSync, fork} = require('child_process');
const {doQuery} = require('../mysqlConnector');
const exec_options = {
cwd: null,
env: null,
encoding: 'utf8',
timeout: 0,
maxBuffer: 200 * 1024,
killSignal: 'SIGTERM'
};
process.on('message', msg=>{
if(msg.filepath && msg.username){
execSync(`java -jar C:\\Users\\colli\\d2reader\\out\\artifacts\\d2reader_jar\\d2reader.jar ${msg.filepath}`, exec_options);
var filename = msg.filepath.replace(/^.*[\\\/]/, '');
filename = __dirname + "\\json\\" + filename.substring(0, filename.length-3) + "json";
try{
const fs = require('fs');
const data = fs.readFileSync(filename, 'utf8');
processSharedStashQueries(JSON.parse(data), msg.username);
} catch(err) {
console.error(err);
}
process.exit();
}
});
const processSharedStashQueries = (data, username) => {
const INSERT_USER_QUERY = `insert into sharedstashes (NumStashes, SharedGold, NumItems, UserID) values (${data.numStashes}, ${data.sharedGold}, ${data.numItems}, (select id from users where username = '${username}'))`;
doQuery(INSERT_USER_QUERY);
};
当子进程调用doQuery()
insideprocessSharedStathQueries()
时,池对象将被记录,我可以验证它是一个有效且已定义的对象,并且与父进程使用的池对象完全相同。但是,当孩子点击pool.query()
代码行时,什么也不会发生。没有错误,也没有控制台日志。好像什么都没发生
为什么子进程可以“看到”池对象,但不能使用它
我的总体方法是否不正确?我担心我可能缺少一些关于如何有效地使用npm mysql来做这样的事情的知识。我应该将MySQL查询智能放在外部java程序中吗?或者这是一个糟糕的设计
提前谢谢 假设
pool
需要pool.connect()
在createPool之后,在index.js中有connect调用吗?在子进程中有吗?池不需要显式的connect()
调用。通过导入const{doQuery,pool}=require('./mysqlConnector'),我能够在index.js
中成功地使用池
然后我就可以从index.js
中成功执行doQuery()
(与子级不同)。我还可以在index.js
中直接使用pool对象,假设pool
需要pool.connect()
在createPool之后,在index.js中是否有connect调用?在子进程中有吗?池不需要显式的connect()
调用。通过导入const{doQuery,pool}=require('./mysqlConnector'),我能够在index.js
中成功地使用池
然后我就可以从index.js
中成功执行doQuery()
(与子级不同)。我还可以在index.js