在Node.js中创建弹性需求机制

时间:2017-07-13 21:53:09

标签: node.js npm require npm-install

我有一个应用程序,我希望它能够抵御缺少的依赖项。某种回退机制,如果依赖项丢失或损坏。

所以我有这个,哪些猴子补丁require(),理论上如果第一次无法加载,将重新安装一个依赖:

const cp = require('child_process');
const Mod = require('module');
const req = Mod.prototype.require;
Mod.prototype.require = function (d) {

  try {
    return req.apply(this, arguments);
  }
  catch (e) {
    if (/^[A-Za-z]/.test(String(d))) {
      console.error(`could not require dependency "${d}".`);
      try {
        var actualDep = String(d).split('/')[0];
        console.error(`but we are resilient and we are attempting to install "${actualDep}" now.`);
        cp.execSync(`cd ${_suman.projectRoot} && npm install ${actualDep}`);
        return req.apply(this, arguments);
      }
      catch (err) {
        console.error('\n', err.stack || err, '\n');
        throw e;
      }

    }
    else {
      throw e;
    }
  }

};

但是上面的补丁没有按预期工作。问题是最初的try语句:

return req.apply(this, arguments);

它主要起作用,但它做了一些奇怪的事情......例如,它开始安装

bufferutil
utf-8-validate

这对我没有意义,因为require()通常没有任何错误,但是当使用补丁时,require()突然失败。

任何人都知道可能会发生什么?超级奇怪。

(注意它所做的只是尝试重新安装以字符[a-zA-z]开头的依赖项,它不会尝试安装以&#39开头的依赖项; ./'等等。)

0 个答案:

没有答案