当前位置: 首页 > 知识库问答 >
问题:

捕捉promise中的错误和拒绝promise[重复]

太叔景同
2023-03-14

我编写了一个函数,它返回异步逐行读取文件的promise,但问题是如果文件不存在,就会抛出错误,应用程序崩溃。我已经将代码包围在try-catch块中,但是代码执行从未进入catch块,而是终止。

其次,我可以拒绝promise,然后从promise中返回json对象吗?

reject({success:false})

const fs = require('fs');
const readline = require('readline');

class fileParser{
    readPolicyFile = function(filePath, fileName) {
        return new Promise((resolve, reject) => {
            try {
                let response = {};
                let readInterface = readline.createInterface({
                    input: fs.createReadStream(`${filePath}/${fileName}`),
                    terminal: false
                });
    
                readInterface
                    .on('line', line => {
                        // Do processing here to create the response
                    })
                    .on('close', () => {
                        resolve(response);
                    });
            } catch(err){
                console.log("Inside catach block");
                reject(err);
            }
        })
    }
}


module.exports = new fileParser();


共有1个答案

太叔弘壮
2023-03-14

你将永远不会看到在catach块行,因为createReadStream不会抛出一个正常的错误。当它想抛出一个错误时,它会发出错误事件。

您需要的是处理createReadStream的错误(而不是readInterface的

const fs = require('fs');
const readline = require('readline');

class fileParser {
  readPolicyFile = function (filePath, fileName) {
    return new Promise((resolve, reject) => {
      let response = {};

      // create a stream and handle it's error event
      const stream = fs.createReadStream(`${filePath}/${fileName}`);
      stream.on('error', (error) => {
        reject(error);
        // or reject({success: false}), but why call reject with data
        // If you don't want to handle error of readPolicyFile function, just call resolve({success: false})
      });

      let readInterface = readline.createInterface({
        input: stream,
        terminal: false
      });

      readInterface
        .on('line', line => {
          // Do processing here to create the response
        })
        .on('close', () => {
          resolve(response);
        });
    })
  }
}

module.exports = new fileParser();

 类似资料:
  • 错误: 我的前端vue应用程序正在和后端正在我正在请求axios从vue文件到后端的get请求。 这就是我的终点 这个错误的原因是什么?

  • 我正在使用Firebase云消息服务辅助角色处理后台推送通知。 当通知(其中包含一些数据的URL)被点击,我想要么: 焦点窗口,如果它已经在所需的URL 导航到URL并聚焦它,如果已经有一个活动的选项卡打开 如果上述条件都不满足,则打开URL的新窗口 点1和3与下面的SW代码一起工作。 出于某种原因,第2点不起作用。promise被拒绝,原因是: 我认为这可能是由于缺少https,但从我的阅读来看

  • 本文介绍了单个promise组合器: 但我没有看到的是,一种运行所有promise的方法,但不是在个人promise被拒绝时短路。我如何确保所有的promise都得到履行,但我能处理拒绝和所有promise的解决?

  • 我正在尝试编写一个jasmine测试,它有一个间谍, 是一个许诺列表。前几次承诺是拒绝,最后一次是成功。虽然测试顺利通过,但Node抱怨如下: 我的代码非常直接:我创建一个间谍,将它注入到我的代码中,调用我的代码,这将循环调用我的间谍直到它不拒绝,然后监视它被调用了5次。间谍是这样的: 被测试的代码在它的链中最后一个空的 来验证我没有引起那里的问题。AFICT,问题是Node看到我在执行 ,并认为

  • 我试图构建一些代码,但我得到了以下两个错误: (节点:12909)unhandledpromiserejectionwarning:nosuchsessionerror:试图在没有建立连接的情况下运行命令。throwdecodederror(/home/mattheW/node_modules/selenium-webdriver/lib/error.js:550:15)在parseHttpRes

  • 我得到这个错误- (节点:18420)未处理的PromisejectionWarning:TypeError:无法读取未定义的属性“name” (节点:18420)未处理的PromisejectionWarning:未处理的promise拒绝。此错误源于在没有catch块的情况下抛出异步函数的内部,或者拒绝使用未处理的promise。catch()。要在未处理的promise拒绝时终止节点进程,请