在没有在本地安装的情况下,按需运行npm软件包作为mircoservices的最佳方法是什么?

时间:2017-05-06 14:20:55

标签: node.js npm microservices

假设我将这些npm包发布到npm: service1@v1.0 service1@v2.0 service2@v1.0 每个包都有一个功能:

function run(extraStr) {
  return 'package_name_and_version' + extraStr; // i.e. service1 v1.0 extraStr
}

我想编写使用软件包的nodejs代码而不在本地安装它

var server = require("my-server-sdk");
  // get(package_name, version, function_in_package, arguments, callback)
  server.get('service1', '2.0', 'run', ['app1'], (err, result) => {
  console.log(result); // this should print service1 v2.0 app1
});

其中my-server-sdk是一个与我的服务器api接口的sdk,它安装所需的软件包并将其缓存以供以后使用。 最好的方法是什么?什么是安全问题以及如何防止任何问题?

这是我想要的简单图表 enter image description here

注意:service1@v1.0 service1@v2.0 service2@v1.0 只是npm中任何包的示例,即lodash

缓存示例:

假设我们的TTL等于 60分钟

client1 在01:00从lodash请求了一个函数,从underscore请求了另一个函数。 现在,服务器lodashunderscore的安装时间戳 01:00

client2 在{strong> 01:30 请求了underscore的功能,该功能可以立即使用,因为之前安装了underscore但是时间戳已更新为的 1:30

02:01 lodash被删除,因为它在过去的TTL currenttime - lodash_timestamp > TTL上没有被使用但underscorecurrenttime - underscore_timestamp < TTL而停留

client3 02:30 请求lodash时, 02:30 再次获得intsalled timestamp

1 个答案:

答案 0 :(得分:1)

npmi包为npm install提供API。

我将使用的逻辑是:

  1. 从npm获取特定包和版本(如果尚未安装,则安装)

  2. 需要nodejs中的包

  3. 使用指定的参数运行指定的方法
  4. 将结果返回给客户
  5. &#13;
    &#13;
    var npmi = require('npmi');
    var path = require('path');
    
    function runModule(moduleName, moduleVersion, moduleMethod, moduleMethodParams) {
    
      return new Promise((resolve, reject) => {
    
        var options = {
          name: moduleName, // your module name 
          version: moduleVersion, // expected version [default: 'latest'] 
          forceInstall: false, // force install if set to true (even if already installed, it will do a reinstall) [default: false] 
          npmLoad: { // npm.load(options, callback): this is the "options" given to npm.load() 
            loglevel: 'silent' // [default: {loglevel: 'silent'}] 
          }
        };
        options.path = './' + options.name + "@" + options.version,
          npmi(options, function(err, result) {
            if (err) {
              if (err.code === npmi.LOAD_ERR) console.log('npm load error');
              else if (err.code === npmi.INSTALL_ERR) console.log('npm install error');
              console.log(err.message);
              return reject(err)
            }
    
            // installed 
            console.log(options.name + '@' + options.version + ' installed successfully in ' + path.resolve(options.path));
    
            var my_module = require(path.resolve(options.path, "node_modules", options.name))
    
            console.log("Running :", options.name + '@' + options.version)
            console.log("Method :", moduleMethod);
            console.log("With params :", ...moduleMethodParams)
            resolve(my_module[moduleMethod](...moduleMethodParams))
          });
    
      })
    
    }
    
    runModule('lodash', '4.10.0', 'fill', [Array(3), 2])
      .then(result => console.log("Result :", result))
    
    runModule('lodash', '3.10.0', 'fill', [Array(3), 2])
      .then(result => console.log("Result :", result))
    &#13;
    &#13;
    &#13;

    您现在可以看到有2个已创建的文件夹(lodash@3.10.0,lodash@4.10.0),表示包名称和版本。

    我已经假设npm在路径中,服务器有权在当前目录中安装软件包,&#34; MODULE_NAME @ MODULE_VERSION&#34; 是有效文件夹当前操作系统下的名称。