如何检查文件是否对require()有效?

时间:2014-08-20 17:51:00

标签: javascript node.js

我想检查文件是否是“可获取的”,我该怎么办?

我检查了npm包,googled stackoverflow和读取nodejs文档,但仍然没有答案。

我搜索编写isRequirable()函数的方式,这将在示例中起作用

明显的例子:

isRequirable('./package.json') // true
isRequirable('./asd.txt') // false

不那么明显的例子:

$ cat normal.js
module.exports = function();

$ cat eval.js
({
    evil: true
})

然后

isRequirable('./normal.js') // true
isRequirable('./eval.js') // false

1 个答案:

答案 0 :(得分:1)

由于不是Node的专家,我建议使用正则表达式和try-catch模块请求进行两步检查。

它涵盖了大多数情况,包括与Browserify或其他打包程序捆绑在一起的文件。

检查出来:

// isRequirable.js
var fs = require('fs');
var isRequirable = function (filename) {
    var result;
    var content;
    var rex = /(?:^|\s*;|\s*=)\s*(?:module\.)*exports(\..+)*\s*=\s*.+/gm;

    try {
        content = fs.readFileSync(filename).toString();
    } catch (err) {
        content = '';
        console.log(err);
    }
    result = content.match(rex) ? true : false;
    if (result) {
        try {
            var temp = require(filename);
        } catch (err) {
            result = false;
            console.log(err);
        }
    }
    return result;
};

module.exports = isRequirable;

在另一个地方

var isRequirable = require('./isRequirable');

console.log(isRequirable('./isRequirable.js'));
// true

console.log(isRequirable('./eval.js'));
// false

console.log(isRequirable('./test.js')); // where test.js is (function () {})();
// false

console.log(isRequirable('nonexistent'));
// { ... no such file or directory ... ]
// false

console.log(isRequirable('./browserify/bundle.js'));
// [ReferenceError: document is not defined]
// false