Javascript NodeJS子进程无法访问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

我的意图是在上传文件时,main Node.JS Express后端进程将派生一个子进程,该子进程将调用java程序来解析上传的文件,然后NodeJS子进程将进行批量(100K+)MySQL查询。我希望子进程处理查询,因为我不希望父进程“阻塞”。因为父进程和子进程都需要访问MySQL连接,所以我在包含
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()
inside
processSharedStathQueries()
时,池对象将被记录,我可以验证它是一个有效且已定义的对象,并且与父进程使用的池对象完全相同。但是,当孩子点击
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