如何在Node.js中正确使用module.exports?脚本传参遇bug求解决
解决Node.js脚本间异步数据传递的问题
我来帮你捋捋这个问题~你现在踩的坑其实是Node.js异步操作的典型问题:exec是异步方法,但你在导出数据的时候没等它执行完,导致拿不到结果。
先看看你代码里的问题:你的input函数里,exec会在后台调用Ruby脚本,等脚本执行完才会触发回调函数拿到stdout。但你直接写module.exports = {'Data':input()},这时候input()本身没有返回任何值(默认返回undefined),导出的Data早已经被赋值成undefined了,等后续stdout拿到数据时,根本没法同步更新这个导出的值。
下面给你两种靠谱的解决方案,按需选就行:
方案1:用回调函数传递数据
修改main.js,让input函数接受一个回调参数,在exec的回调里把数据传给它:
var exec = require('child_process').exec; function input(callback) { exec('ruby user_zipcode.rb', function (err, stdout) { if (err) { callback(err, null); } else { // 可以用trim()去掉多余的换行符 callback(null, stdout.trim()); } }); } module.exports = { Data: input };
然后在接收数据的脚本里,这样调用:
const main = require('./main.js'); main.Data(function(err, data) { if (err) { console.error('执行出错:', err); return; } console.log('拿到的邮编数据:', data); // 在这里处理你的数据逻辑 });
方案2:用Promise封装(更推荐,现代Node.js写法)
把异步操作封装成Promise,这样可以用async/await让代码更像同步逻辑:
var exec = require('child_process').exec; function input() { return new Promise((resolve, reject) => { exec('ruby user_zipcode.rb', function (err, stdout) { if (err) { reject(err); } else { resolve(stdout.trim()); } }); }); } module.exports = { Data: input };
接收数据的脚本里可以这么用:
const main = require('./main.js'); // 方式一:用.then/.catch链式调用 main.Data() .then(data => { console.log('拿到的邮编数据:', data); // 处理数据 }) .catch(err => { console.error('执行出错:', err); }); // 方式二:用async/await(需要在async函数内执行) async function fetchZipcode() { try { const data = await main.Data(); console.log('拿到的邮编数据:', data); // 处理数据 } catch (err) { console.error('执行出错:', err); } } fetchZipcode();
最后补充个小提醒:先单独运行ruby user_zipcode.rb确认脚本能正常输出数据到控制台,要是Ruby脚本本身没输出或者报错,那Node.js这边肯定拿不到数据哦~
内容的提问来源于stack exchange,提问作者user8116786
相关产品推荐
相关产品推荐

