Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 不在本地安装的情况下,按需将npm包作为mircoservices运行的最佳方法是什么?_Node.js_Npm_Microservices - Fatal编程技术网

Node.js 不在本地安装的情况下,按需将npm包作为mircoservices运行的最佳方法是什么?

Node.js 不在本地安装的情况下,按需将npm包作为mircoservices运行的最佳方法是什么?,node.js,npm,microservices,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");

假设我将这些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
});
其中
我的服务器sdk
是一个与我的服务器api接口的sdk,它安装所需的软件包,并将其缓存以供以后使用。 最好的方法是什么?安全问题是什么,如何防止

这是我想要的一个简单的图表

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


缓存示例:

让我们假设TTL等于60分钟

client1在01:00从
lodash
请求了一个函数,从
下划线
请求了另一个函数。 现在,服务器中的
lodash
下划线
都安装了时间戳01:00

client201:30
下划线请求了一个函数,该函数立即被使用,因为
下划线之前已安装,但其时间戳已更新为1:30

02:01
lodash
被删除,因为它在过去的TTL
currenttime-lodash\u timestamp>TTL
上没有被使用,但
下划线
保留,因为
currenttime-下划线\u timestamp

因此,当client302:30请求
lodash
时,它会再次以02:30作为
时间戳

插入
,其中有一个包为npm安装提供了一个API

我将使用的逻辑是:

  • 从npm获取特定的软件包和版本(如果尚未安装,请安装)

  • 需要nodejs中的包

  • 使用指定的参数运行指定的方法
  • 将结果返回给客户端
  • var npmi=require('npmi');
    var path=require('path');
    函数runModule(moduleName、moduleVersion、moduleMethod、moduleMethodParams){
    返回新承诺((解决、拒绝)=>{
    变量选项={
    名称:moduleName,//您的模块名称
    版本:moduleVersion,//预期版本[默认值:最新版本]
    forceInstall:false,//如果设置为true,则强制安装(即使已安装,也会重新安装)[默认值:false]
    npmLoad:{//npm.load(选项,回调):这是给定给npm.load()的“选项”
    loglevel:'silent'/[默认值:{loglevel:'silent'}]
    }
    };
    options.path='./'+options.name+“@”+options.version,
    npmi(选项、功能(错误、结果){
    如果(错误){
    if(err.code==npmi.LOAD_err)console.log('npm LOAD error');
    else if(err.code==npmi.INSTALL_err)console.log('npm INSTALL error');
    控制台日志(错误消息);
    退货拒绝(err)
    }
    //安装
    console.log(options.name+'@'+options.version+'已成功安装在'+path.resolve(options.path));
    var my_module=require(path.resolve(options.path,“node_modules”,options.name))
    log(“正在运行:”,options.name+'@'+options.version)
    log(“方法:”,模块方法);
    log(“带参数:,…moduleMethodParams)
    解析(my_模块[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])
    
    。然后(result=>console.log(“result:,result))
    我不确定我是否理解您试图解决的问题。NPM已经为您处理版本控制<代码>要求()
    缓存。为什么不想在本地安装SDK?你在问什么样的安全问题?@Brad我想将npm软件包用作微服务,而不在本地安装,我唯一想安装的是SDK,它与我的服务器连接以运行微服务。安全问题,比如调用一个从服务器上删除文件的函数(我希望每个包都在沙箱中运行),我仍然不明白您到底想做什么。您的SDK可以只是服务的客户端。不管是不是SDK,如果你不阻止人们删除你服务器上的东西,直接点击你的服务就可以了。如果要在本地运行代码,则必须具有该代码。虽然您可以获取和评估该JavaScript,但您正在为零增益创建不必要的复杂性。为什么它是否在磁盘上很重要?不管怎样,总有人会把你的代码转储到磁盘上。而且,这并不是说microservice客户端隐藏了什么……如果我理解了您想告诉服务器“npm安装模块”的问题,请导入该模块,从该模块运行特定方法并返回结果。请对此给出一些反馈,以便我可以发布一些我想发布的代码。@alex rokabilis正是这样,请注意,我可以从同一个包调用函数,但版本不同。我喜欢这样,谢谢alex。在TTL之前未使用的包被删除的情况下,您认为实现缓存系统的最佳方法是什么?我不明白。你能提供更多的信息吗?或者举个例子会更好。将这种构建时逻辑引入运行时有什么好处?@timaschew它有很多好处,实际上有一些好处:1-您可以跨不同的编程语言使用包,例如python、java。2-如果你在一个包中有一个bug,你可以单独更新它,而不用担心每次更新包时都会更新每个客户机3-将代码拆分为自组