根据路由动态加载Node.js模块

我正在使用express在Node.js中做一个项目。这是我的目录结构:

root

|-start.js

|-server.js

|-lib/

| api/

| user_getDetails.js

| user_register.js

lib/api/目录包含许多与API相关的JS文件。我需要做的是建立一个挂钩系统,每当从快速HTTP服务器请求一个API函数时,它就会执行相应的API处理程序中指定的任何操作。这可能令人困惑,但希望您能理解。

  1. Larry通过POST发送请求以获取用户详细信息。
  2. 服务器查找lib/api以查找与该请求关联的功能。
  3. 服务器执行操作并将数据发送回Larry。

希望你能帮助我。我当时认为可以使用原型来完成,但不确定。

谢谢!

回答:

如果您知道脚本的位置,即您有一个初始目录(例如)DIR,则可以使用fs,例如:

var fs = require('fs');

var path_module = require('path');

var module_holder = {};

function LoadModules(path) {

fs.lstat(path, function(err, stat) {

if (stat.isDirectory()) {

// we have a directory: do a tree walk

fs.readdir(path, function(err, files) {

var f, l = files.length;

for (var i = 0; i < l; i++) {

f = path_module.join(path, files[i]);

LoadModules(f);

}

});

} else {

// we have a file: load it

require(path)(module_holder);

}

});

}

var DIR = path_module.join(__dirname, 'lib', 'api');

LoadModules(DIR);

exports.module_holder = module_holder;

// the usual server stuff goes here

现在,您的脚本需要遵循以下结构(由于该require(path)(module_holder)行),例如:

function handler(req, res) {

console.log('Entered my cool script!');

}

module.exports = function(module_holder) {

// the key in this dictionary can be whatever you want

// just make sure it won't override other modules

module_holder['user_getDetails'] = handler;

};

现在,在处理请求时,您可以执行以下操作:

// request is supposed to fire user_getDetails script

module_holder['user_getDetails'](req, res);

这应该将所有模块加载到module_holder变量。我没有测试它,但是它应该可以工作(

)。您可能想要更改此功能(例如,制作module_holder一棵树,而不是一级字典),但我想您会理解的。

此功能应该在每次服务器启动时加载一次(如果您需要更频繁地触发它,那么您可能正在处理动态服务器端脚本,这是一个绝妙的主意,恕我直言)。现在,您唯一需要做的就是导出module_holder对象,以便每个视图处理程序都可以使用它。

以上是 根据路由动态加载Node.js模块 的全部内容, 来源链接: utcz.com/qa/400046.html

回到顶部