方法覆盖节点模块

时间:2016-12-18 22:42:26

标签: javascript node.js npm function-overriding

我正在使用keystone节点模块在我的应用程序中开发基于cms的页面。

我只是将keystone添加到我的js文件中来初始化keystone:var keystone = require('keystone');
但我目前面临的问题是,每个基于keystone的cms功能的路由是 的 localhost:3000/keystone/<featue-name>

我想从网址中删除keystone,并使用该应用程序所需的其他名称。在keystone的节点模块内部进行更改就可以了!

但如果我做了npm update我的所有改变都是徒劳的。通常,在其他语言中,我习惯用METHOD OVERRIDING来做。我不知道节点模块中的方法覆盖 还有其他办法吗?

2 个答案:

答案 0 :(得分:3)

从我在the source中可以看到,管理路径前缀是可配置的(只是没有记录):

keystone.init({
  ...
  'admin path' : 'your-own-path',
  ...
});

(这将使路径 localhost:3000/your-own-path/<feature-name>

如果您没有使用最新的Keystone,也许这可能有效(虽然这有点像黑客):

keystone.pre('routes', function(req, res, next) {
  req.url = req.url.replace(/^\/your-own-path/, '/keystone');
  next();
});

这样做会将请求的网址中的/your-own-path前缀替换为/keystone,有点像“内部重定向”。

答案 1 :(得分:1)

node_modules中的源代码进行更改并不是解决问题的好方法,因为它不受版本控制,因此处理回购的每个人都必须手动更改它。相反,您可以将repo分叉到您自己的Github帐户,进行更改,然后安装该版本的Keystone:

$ npm install --save keystone@git+https://github.com/your-username/keystone.git

更好的是,修改默认为/keystone,但可以使用Keystone options进行更改,并将PR创建回Keystone!修复它之后的用法应该如下所示:

keystone.set('url', 'custom'); // Changes /keystone to /custom