koa 接口异步返回数据问题

用koaJS实现了一个接口,接口里面读取了一个文本文件,但是返回数据的时候不能等待文件处理完成后返回数据,而是在最外层才能返回数据。求解。
已解决,附上代码


'use strict';
const readline = require('readline');
const fs = require("fs");
const path = require('path');

module.exports = async function (ctx) {
    let filePath = path.resolve(__dirname, '../../../../public/assets/a.txt');
    try {
        const result = await readFile(filePath);
        //区分结果页和情景页
        let atom_wise = [];
        let atom_card = [];
        let atom_wise_sum = 0;
        let atom_card_sum = 0;
        
        for (let i = 0; i < result.length; i++) {
            // 遍历单个卡片
            for (let j = 0; j < result[i].length; j++) {
                // 结果页卡片
                if(result[i][j] === '1'){
                    atom_wise_sum++;
                    atom_wise.push(result[i]);
                }
                // 情景页卡片
                if(result[i][j] === '2' ){
                    atom_card_sum++;
                    atom_card.push(result[i]);                    
                }
                
            }
        }

        ctx.json({
            status: 0,
            msg: '成功',
            atom_wise_sum,
            atom_card_sum,
            atom_wise,
            atom_card
        });

    } catch (e) {
        console.error(e);
        ctx.json({
            status: 1,
            msg: '失败'
        });
    }


};

function readFile(filePath) {
    console.log('开始读取文件...');
    let input = fs.createReadStream(filePath);
    const rl = readline.createInterface({
        input
    });
    let result = [];
    let lineData;

    return new Promise((resolve, reject) => {
        rl.on('line', (line) => {
            if (line.split(/\s+/)[4] === 'atom') {
                lineData = line.split(/\s+/);
                result.push(lineData);
            }
        });

        rl.on('close', (line) => {
            console.log("读取文件完毕!");
            resolve(result);
        });

        rl.on('error', reject);
    });

}
阅读 4.7k
2 个回答
'use strict';
const readline = require('readline');
const fs = require("fs");  
const path = require('path');

module.exports = async function (ctx) {
    let filePath = path.resolve(__dirname, '../../../../test/a.txt');
    try {
        const result = await readFile(filepath);
        
        ctx.json({
            status: 0,
            msg: '成功2',
            result,
        }); 

    } catch (e) {
        ctx.json({
            status: 1,
            msg: '失败',
            result,
        }); 
    }

        
};

function readFile(filePath) {
    let input = fs.createReadStream(filePath);
    const rl = readline.createInterface({
        input
    });
    let result = [];
    let lineData;

    return new Promise((resolve, reject) => {
      rl.on('line', (line) => {
          if(line.split(/\s+/)[4] === 'atom'){
              lineData = line.split(/\s+/);
              result.push(lineData);
          }
      });
      
      rl.on('close', (line) => {
          console.log(result);
          console.log("读取完毕!");

          resolve(result);
      });

      rl.on('error', reject);
    });
    
}

文件处理包装成Promise,然后使用async await就可以了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题