微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

NodeJS Express:分叉的子进程无法使用池进行批量MySQL查询

如何解决NodeJS Express:分叉的子进程无法使用池进行批量MySQL查询

我的意图是在文件上传时,主Node.JS进程将派生一个子进程,该子进程将解析上传文件,然后进行批量(1K +)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

我能够将池和doQuery方法都导入到我的主Express index.js中,并可以毫无问题地使用它们:

index.js

const {doQuery,pool} = require('./MysqLConnector');

app.get('/',(req,res) => {

    const { username,password } = req.query;

    const GET_USER_QUERY = `select username,password from users where username = '${username}' and password = '${password}'`;
    doQuery(GET_USER_QUERY); //logically insignificant function call but wanted to verify doQuery works from here
    console.log(pool);
    pool.getConnection(function(err,connection){
        if (err) {
            connection.release();
            throw err;
        }   
        connection.query(GET_USER_QUERY,(err,results) => {
            if(!err) {
                console.log(results);
                connection.release();
                return res.json(results);
            }           
            else{
                console.log(err);
                connection.release();
            }
        });
    });
});

一切都可以在MysqLConnector.js中使用index.js正常工作,但是,派生的子进程可以成功导入并从MysqLConnector.js中“看到”池对象,但是“不起作用”当子进程尝试使用导出的池或doQuery函数时。

这是index.js中将分叉一个孩子的代码块:

index.js

app.post('/upload',upload.single('thefile'),res) => {
    const {username} = req.query;
    
    fileHandlerProcess = fork("./fileupload/handleprops.js");
    fileHandlerProcess.on('message',(msg) => {
        console.log(`PARENT: message from child process is ${msg}`);
        res.sendStatus(msg.status);
    });
    fileHandlerProcess.send({"filepath":`${__dirname}\\${req.file.path}`,"username":`${username}`});
});

这是handleprops.js,分叉的孩子将运行的js文件

handleprops.js

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()”时,将记录该池对象,并且我可以确认它是有效且已定义的对象,并且与父进程(index.js)使用的池对象完全相同。但是,当孩子点击“ pool.query()”代码行时,什么也不会发生。没有错误,也没有控制台日志。好像什么也没发生。

为什么子进程可以“看到”池对象但不能使用它?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。