1

我对 Node.JS 开发很陌生,我正在尝试创建一个 Hubot 适配器。

hubot模块导出一个名为TextMessage我需要使用的类。在我的适配器中,我创建了一个实例并将其传递给正在运行的机器人,如下所示:

{Adapter, TextMessage} = require 'hubot'
class MyAdapter extends Adapter
  onNewMessage: (text) =>
    @receive new TextMessage text

但是,在 Hubot 自己的代码中,它正在检查我的消息是否为instanceof TextMessage. 当我运行机器人并使用我的适配器时,此检查总是失败。

项目结构如下所示:

my-bot
 |- node_modules
    |- my-adapter
    |  |- node_modules
    |  |  |- hubot
    |- hubot  

结果require('hubot')my-adapter给了我一个不同hubot的模块副本my-bot

我很确定我在这里不了解 Node 模块的一些基本概念。我究竟做错了什么?

4

1 回答 1

2

以这种方式设计的原因是模块可以始终获得“新”版本(尚未被任何库修改,例如您的库)。通常,如果您require()是您的依赖项之一,那么您应该能够依赖该模块的默认行为。 (替代方案是不可预测的,并且可能不安全。)

如果您的模块的目的是适应另一个模块,那么您应该:

返回修改后的模块

例如,您的模块可能会:

module.exports = require('hubot');
// ... your custom modifications

或者:

var hubot = module.exports.hubot = require('hubot');

这意味着应用程序本身不依赖于hubot,而只依赖于您的模块。

hubot作为适配器的依赖项列出

Node.jsrequire()在路径上调用级联 - 因此,如果您只是不hubot作为依赖项安装,那么您仍然require()可以使用它,它将使用应用程序中的版本。

这意味着可以在不安装的情况下安装模块hubot,从而导致问题 - 但另一方面,它也允许多个模块修改同一个基本模块。

就个人而言,我会选择第二个选项。

于 2014-02-11T16:56:41.947 回答