【问题标题】:check if required JSON is valid - node检查所需的 JSON 是否有效 - 节点
【发布时间】:2015-06-19 08:10:08
【问题描述】:

如果我需要一个文件

require('file.json'); 

如何检查 JSON 是否有效?试着抓? 我正在使用 bluebird 承诺,所以现在它刚刚返回

 Promise.resolve(require('file.json')); 

如果找不到文件,bluebird 会捕获,但我还需要检查 JSON 的完整性。我知道你可以将 JSON.parse 传递给一个 thenable,如果文件本身被 FS 或其他任何东西作为字符串返回,但我不介意缓存并且要求会更快

【问题讨论】:

  • require 是同步的,不需要把它包装在一个promise中
  • 添加到 Esailija 所说的内容 - 如果您在服务器启动但失败时有一个同步的 require - 您想要它抛出
  • 我必须在一个很长的 .then 链中返回一个承诺

标签: json node.js promise require bluebird


【解决方案1】:

问题

Promise.resolve(require('file.json')); 

是它的运行方式

var obj = require('file.json'); 
Promise.resolve(obj); 

这意味着如果require 抛出,promise 将无法捕捉它。相反,我建议这样做

new Promise(function(resolve){
    resolve(require('file.json'));
})

这会在 Promise 中执行 require,因此抛出的错误将被正确捕获。

【讨论】:

    【解决方案2】:

    您正在寻找Bluebird try function。如果你使用resolverequire() 调用可能会在其结果被封装在 Promise 中之前抛出。

    Promise.try(require, 'file.json')
    Promise.try(() => require('file.json')) // Bluebird 3.0
    

    交替使用

    Promise.resolve('file.json').then(require)
    // or
    Promise.method(require)('file.json')
    

    【讨论】:

    • 此表单将在 3.0 btw 中弃用 :-)
    • @Esailija:我在哪里可以找到相关信息? 3.0 分支中的API.md 还没更新……是不是我们一直都需要用到数组?
    • 这很尴尬。用箭头只取一个函数还不错Promise.try(_ => require('file.json'))
    • @Esailija:嗯,我喜欢。当然也有使用两个调用的替代方案……
    猜你喜欢
    • 2012-08-12
    • 2011-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多