如何枚举模块中的包依赖项?

时间:2017-12-25 15:48:38

标签: javascript node.js

伙计们我一直在编写一个node_module,它给你所选模块的依赖关系,所以有我的代码

function depend(modulename, cb) {
let package = JSON.parse(fs.readFileSync("./node_modules/"+modulename+'/package.json', "utf8"));
var re = 'CHECKING' ? package.dependencies : 'The module has no dependencies';
cb(re)  
}

const fs = require('fs');

module.exports = depend;

当我运行它时它在一个模块上没有模块它给我{}而不是The module has no dependencies,那么任何想法?

2 个答案:

答案 0 :(得分:1)

我建议看看Ternary (conditional) Operator的工作原理。

参考您发布评论的代码:

您当前的代码只是检查package.dependencies的存在,即使它是一个空对象,像if(package.dependencies)...这样的东西也会评估为true,因为空对象是truthy值。

您需要做的是检查对象本身是否为空。一种方法是使用Object.keys检查其密钥的长度。

var re = Object.keys(package.dependencies).length ? package.dependencies : 'The module has no dependencies';

但更好的检查是你的方法和这个方法的结合:

var re = package.dependencies && Object.keys(package.dependencies).length ? ...

因为它检查package.dependencies是否存在以及它是否为空。

答案 1 :(得分:1)

var re = 'CHECKING' ? package.dependencies : 'The module has no dependencies';ternary

这意味着:

  

如果'检查'然后将package.dependencies分配给re,否则将'The module has no dependencies'分配给re

这是您的错误,if ('CHECKING')将始终评估为true,因此始终会将package.dependencies分配给re。您必须将代码重构为以下内容:

var re = Object.keys(package.dependencies).length > 0 ? package.dependencies : 'The module has no dependencies';

将测试package.dependencies是否具有一个或多个依赖项,以便影响re的正确值。我们不会在length上使用package.dependencies因为它是一个没有任何length属性的对象,而是使用Object.keys

在您在评论中提供的第二个示例中,if (package.dependencies)也将始终评估为true,因为package.dependencies不为空或未定义,因此它被视为{ {1}}。