我正在研究使用架构师来组织我的 Node 项目

https://github.com/c9/architect

在下面的演示文稿的幻灯片66中,它显示了如何创建插件实例。

http://www.slideshare.net/sergimansilla/architecting-large-nodejs-applications-14912706

这是代码段:

function startNewGame(name) {
   var game = db.createNewGame(name);

   var config = [
      {
        packagePath: "./game-status",
        game: game
      }
   ];

   architect.createApp(/* snip  */)

我无法确定应将哪些参数放入createApp中。在文档中,它仅提及已从磁盘加载的配置,如下所示
var architect_config = architect.loadConfig(path.join(__dirname, 'plugins.json'));

当我尝试像上面的示例一样直接加载配置时,它会引发错误
/code/npm_module_tests/architect_test/node_modules/architect/architect.js:423
            throw err;
                  ^
Error: Plugin is missing the setup function {"packagePath":"./app"}

这是我的代码
var path = require('path');
var architect = require('architect');

var config = [{
  "packagePath": "./app2"
}]


var arch = architect.createApp(config, function (){
  console.log('application started');
});

那么,如何使用architect.js创建插件实例?

编辑:

我已经阅读了代码,似乎需要通过loadConfig方法准备配置,假设该配置位于磁盘上。然后,如何如幻灯片所示将插件实例注入(inject)到配置中?

最佳答案

使用architect.resolveConfig,当config位于js文件中时,loadConfig在内部使用它

function loadConfig(configPath, callback) {
  var config = require(configPath);
  var base = dirname(configPath);

  return resolveConfig(config, base, callback);
}

尝试
var plugins = [{
   provides: ["myService"], consumes: [],
   setup: function(options, imports, register){
      console.log(arguments)
      register(null, { myService: {}})
   }
}, {
   provides: [], consumes: ["myService"],
   setup: function(options, imports, register){
      console.log(imports.myService)
   }
}, {
   packagePath: "./app"
   game: game
}]

architect.resolveConfig(plugins, __dirname, function(err, config) {
    var app = architect.createApp(config, function(err, app) {
        console.log(err, app)
    })
    app.on("service", function (service) {
        console.log(service)
    })
})

或同步版本
var config = architect.resolveConfig(plugins, __dirname)
var app = architect.createApp(config)
app.on("service", function (service) {
    console.log(service)
})

10-04 15:23