You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 16:22:26