Node.js跨文件调用问题:如何从test.js获取Geotab API数据到index.js?
解决子进程调用后无法获取数据的问题
我来帮你搞定这个问题——你现在的核心问题是子进程(test.js)没有把API返回的数据传递给父进程,同时父进程也没有监听子进程发送的消息,所以才拿不到结果。下面是具体的修复方案:
第一步:修改根目录的test.js,让它把数据发送给父进程
当前你的test.js只是处理了API的Promise,但没有把结果传递出去。我们需要在Promise的then和catch里,用process.send()把数据发给父进程,然后主动退出子进程:
const GeotabApi = require('mg-api-js'); const authentication = { credentials: { database: '***', userName: '***', password: '***' } } const api = new GeotabApi(authentication); api.call('Get', { typeName: 'Group', resultsLimit: 100 }) .then(result => { // 把成功结果发送给父进程 process.send({ success: true, data: result }); // 主动退出子进程 process.exit(0); }) .catch(error => { // 把错误信息发送给父进程 process.send({ success: false, error: error.message }); // 以错误码退出子进程 process.exit(1); });
第二步:修改functions/index.js,监听子进程的消息并传递数据
你的runScript函数目前只监听了错误和退出事件,需要添加message事件监听来接收子进程发来的数据,同时调整回调函数,让它能把数据传递出去:
var childProcess = require('child_process'); function runScript(scriptPath, callback) { var invoked = false; var process = childProcess.fork(scriptPath); // 监听子进程发送的消息 process.on('message', function (message) { if (invoked) return; invoked = true; // 把消息(数据/错误)传递给回调 callback(null, message); }); process.on('error', function (err) { if (invoked) return; invoked = true; callback(err); }); process.on('exit', function (code) { if (invoked) return; invoked = true; var err = code === 0 ? null : new Error('exit code ' + code); callback(err); }); } exports.test_groups_list = functions.https.onRequest(async (req, res) => { runScript('../test.js', function (err, data) { if (err) { res.set({ 'Access-Control-Allow-Origin': '*' }).send({ "status": 0,"msg":err.message }); } else { if (data.success) { res.set({ 'Access-Control-Allow-Origin': '*' }).send({ "status": 1, "data": data.data }); } else { res.set({ 'Access-Control-Allow-Origin': '*' }).send({ "status": 0, "msg": data.error }); } } }); });
关键说明
process.send()是Node.js子进程(通过fork创建的)和父进程之间通信的标准方式,它可以发送JSON可序列化的数据。- 子进程处理完API请求后必须主动调用
process.exit(),否则子进程会一直保持运行状态,父进程的exit事件不会触发。 - 父进程通过
message事件接收子进程的消息,这样就能拿到API返回的结果或者错误信息,然后返回给前端。
内容的提问来源于stack exchange,提问作者Nikul Panchal
相关产品推荐
相关产品推荐

