如何解决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
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 举报,一经查实,本站将立刻删除。