Node.js逐行读取文件后返回JSON字符串遇undefined问题求助
解决Node.js逐行读取文件后返回结果的问题
你遇到的核心问题是异步操作的时序坑——逐行读取文件是异步过程,你的myfunction没有正确通过Promise把异步结果传递出去,导致调用fct.myfunction()时,异步读取还没完成,直接拿到了undefined。下面给你具体的修复方案:
第一步:修改romlist-parser.js,用Promise包裹异步读取过程
把逐行读取的逻辑放在Promise里,读取完成后通过resolve返回JSON字符串,同时处理错误情况:
var fs = require('fs'); var readline = require('readline'); function myfunction() { // 返回一个Promise,让调用者能等待异步操作完成 return new Promise((resolve, reject) => { // 替换成你的实际文件路径 const fileStream = fs.createReadStream('./your-romlist-file.txt'); const rl = readline.createInterface({ input: fileStream, crlfDelay: Infinity // 识别所有换行符 }); const resultList = []; // 处理每一行数据 rl.on('line', (line) => { // 这里可以根据你的需求处理每一行,比如解析后再存入数组 resultList.push(line); }); // 读取完成时,把结果转为JSON字符串并返回 rl.on('close', () => { const jsonResult = JSON.stringify(resultList); resolve(jsonResult); }); // 处理读取错误 rl.on('error', (err) => { reject(new Error(`读取文件失败:${err.message}`)); }); }); } // 导出函数供main.js调用 module.exports = { myfunction };
第二步:修改main.js的调用方式
因为myfunction现在返回的是Promise,你需要用.then()或者async/await来获取异步结果,不能直接同步打印:
方式1:使用.then()链式调用
var fct = require('./romlist-parser'); fct.myfunction() .then(jsonStr => { console.log(jsonStr); // 这里就能拿到预期的JSON字符串了 }) .catch(err => { console.error(err); // 捕获并打印错误 });
方式2:使用async/await(更简洁的异步写法)
var fct = require('./romlist-parser'); // 把代码放在async函数里才能用await async function run() { try { const jsonStr = await fct.myfunction(); console.log(jsonStr); } catch (err) { console.error(err); } } run();
为什么原来的代码会输出undefined?
原来的myfunction大概率没有返回Promise,或者在异步读取完成前就已经执行完函数并返回了(异步操作还在后台跑),所以调用时直接拿到了undefined。而用Promise包裹后,函数会返回一个Promise对象,调用者可以等待这个Promise完成,从而获取到最终的结果。
内容的提问来源于stack exchange,提问作者user1864255
相关产品推荐
相关产品推荐

