Javascript 使用新操作扩展节点应用程序

Javascript 使用新操作扩展节点应用程序,javascript,node.js,Javascript,Node.js,我已经创建了一个应用程序,它可以处理一些基本操作,如保存(例如,在文件系统中保存文件)编辑等,现在我希望一些用户能够通过新操作扩展此功能,例如用户 将克隆应用程序并添加具有新操作(和一些回调)的附加文件,然后在某些事件上注册 我应该把这个新动作隐藏起来,我的问题是如何从新文件中执行这个新动作,然后在我的过程中运行,简单的例子将非常有用 更新 假设这是我处理操作的文件,用户希望添加其他操作,如删除 var fs = require('fs'); module.exports = { fil

我已经创建了一个应用程序,它可以处理一些基本操作,如保存(例如,在文件系统中保存文件)编辑等,现在我希望一些用户能够通过新操作扩展此功能,例如用户 将克隆应用程序并添加具有新操作(和一些回调)的附加文件,然后在某些事件上注册

我应该把这个新动作隐藏起来,我的问题是如何从新文件中执行这个新动作,然后在我的过程中运行,简单的例子将非常有用

更新 假设这是我处理操作的文件,用户希望添加其他操作,如删除

var fs = require('fs');
module.exports = {
    fileAction: function (req, res, filePath) {
        var urlAction = urlPath.substr(urlPath.lastIndexOf("/") + 1);
        if (urlAction === 'save') {
            this.save(req,res,filePath);
        } else
            this.delete(req,res,filePath);
    },

    save: function (req,res,filePath) {
        var writeStream = fs.createWriteStream(filePath, {flags: 'w'});
        req.pipe(writeStream);
        res.writeHead(200, { 'Content-Type': 'text/plain' });
    },

    delete: function (req,res,filePath) {

    },

}
删除代码应该是这样的

 filePath = 'C://test.txt';
    fs.unlinkSync(filePath);

现在,由于
lordvlad
建议用户应该有一个新的文件及其具体实现,该文件应该由
lordvlad
建议设计流程使用,我的问题是如何添加此删除功能(非常简单)并使其正常工作,就像一些POC一样。

我可以想象一些插件系统是这样的:

main.js

plugins/my-plugin.js

当然,您可以用一些全局对象替换事件发射器,或者通过传递回调而不是事件总线来让插件处理回调。我认为关键的方面是加载插件(在
glob…require
块中完成),并使它们适合您的系统(您需要自己弄清楚或者提供一些您已经拥有的代码示例,以便有人能给您另一个提示)

更新OPs更新后

main.js

var glob = require('glob');
var xtend = require('xtend');



module.exports = {
  save: function(..){..},
  load: function(..){..},
}

// typeof module.exports.delete === 'undefined',
// so you cannot call module.exports delete or similar

glob("plugins/*.js", function(err, files) {
  files.forEach(function(file){
    var plugin = require(file);

    // call plugin initializer if available
    if (typeof plugin.init === "function")
      plugin.init();

    xtend(module.exports, plugin);
  });


  // here all plugins are loaded and can be used
  // i.e. you can do the following
  module.exports.delete(...);
});
plugins/my-plugin.js

module.exports = {
  delete: function(..){..},
  init: function() {
    // do something when the plugin loads
  }
}

请注意,任何插件都可能覆盖另一个插件的方法。

你的问题并不清楚你真正想要什么,你能发布一些代码示例或高级psuedo代码吗?@Sikorski-完成请查看我的更新帖子非常感谢非常有趣,投票通过了!你为什么要使用事件总线?我需要用户发送一些回调…你能提供一些示例来实现这个范例吗?因为我想验证这个设计是否有效…假设我已经有一个函数正在处理save(请参阅我更新的帖子)和用户使用delete file扩展我的功能,提前谢谢!谢谢一个问题是,当我提供我的代码时,我只是保存而不是删除或加载,因为这应该是来自用户的东西,我只需要调用此功能…就像我在更新的帖子中提供的删除功能一样,我使用xtend(module.exports,plugin);但是在模块内部我有一些方法可以运行,比如delete,我应该如何动态调用它呢?提前感谢专家!非常感谢专家!,另一个问题是为什么我应该使用module.exports.delete(…);如果我有一个init,在init中,用户可以这样说。删除,这个操作将被调用…你能解释一下吗?也许这是更好的设计2。有一个选项可以从main向操作传递参数?如果是,那么就说每次传递每个操作(req、res、path)…好吧,我想你指的是带有“extend”的“plugins”。否则,它只是简单的模块处理。您甚至不需要
init
方法,因为模块是在需要时执行的。
var glob = require('glob');
var xtend = require('xtend');



module.exports = {
  save: function(..){..},
  load: function(..){..},
}

// typeof module.exports.delete === 'undefined',
// so you cannot call module.exports delete or similar

glob("plugins/*.js", function(err, files) {
  files.forEach(function(file){
    var plugin = require(file);

    // call plugin initializer if available
    if (typeof plugin.init === "function")
      plugin.init();

    xtend(module.exports, plugin);
  });


  // here all plugins are loaded and can be used
  // i.e. you can do the following
  module.exports.delete(...);
});
module.exports = {
  delete: function(..){..},
  init: function() {
    // do something when the plugin loads
  }
}