我正在运行一个Express服务器,它通过POST请求接收JSON,然后将其保存到一个名为test.json的文件中,然后启动另一个名为demo.js的脚本,该脚本读取test.json,进行一些计算,然后在其工作目录中写入一个名为result.json的文件。此时,express服务器应该读取demo.js创建的result.json,然后将其发送回发出POST请求的服务器。
现在的问题是,如果我使用node demo.js命令直接从终端执行demo.js文件,它会创建文件,而当从Express服务器执行时,它会执行除文件创建之外的所有操作,因此服务器会抛出异常,因为它找不到必须作为POST请求的响应发送回来的文件。
下面是Express服务器的代码:
//Function that runs the demo.js script
function runScript(scriptPath, callback) {
// keeps track of whether callback has been invoked to prevent multiple invocatio> var invoked = false;
var process = childProcess.fork(scriptPath);
// listen for errors as they may prevent the exit event from firing
process.on('error', function (err) {
if (invoked) return;
invoked = true;
callback(err);
});
// execute the callback once the process has finished running
process.on('exit', function (code) {
if (invoked) return;
invoked = true;
var err = code === 0 ? null : new Error('exit code ' + code);
callback(err);
});
} app.post('/', (req, res) => { console.log("Received");
fs.writeFile('./solver/src/test.json', JSON.stringify(req.body) , err => {
if(err){
console.error(err);
}
});
runScript('./solver/src/demo.js', function (err) {
if (!err){
fs.readFile('./solver/src/result.json', (err, data) => {
if(err) throw err;
const jsonResp = JSON.stringify(data);
res.send(data);
console.log('finished running some-script.js');
});}
else{
console.error(err);
}
});
});
这是demo.js文件
//result is a string generated by previous instructions //contained in the demo.js file, it gets correctly //printed by the console.log at the end of the script
fs.writeFile('./result.json', JSON.stringify(result) , (err) => {
if(err){ console.error(err); }
else{ console.log("File created succesfully"); }
});
console.log(JSON.stringify(result, null, 1));
我尝试通过添加{flag来修改demo.js文件:'w'}在writeFile函数中无效。
1条答案
按热度按时间tgabmvqs1#
通过使用完整路径('./solver/src/demo.js')调用fork,demo.js的当前工作目录就是express应用程序的当前工作目录。使用fork的
cwd
选项将fork进程的工作目录设置为'./solver/src/',您应该在预期的位置看到文件。