NodeJS'要求'在coffeescript中加载库,在Javascript中加载空对象

时间:2015-03-18 09:36:01

标签: javascript node.js ubuntu coffeescript

我在NodeJS中遇到一个有趣的问题,它偶尔会出现在工作中,而我却无法弄明白。

我已经在CoffeeScript中编写了一个后端,然后我将grunt-contrib-coffee编译到〜/ bin目录中的Javascript中。我还包括一个我私下在Bitbucket上托管的库和相应的私钥,并通过npm安装。这个库也是用coffeescript编写的。

通常我能够在Javascript中包含这个库而不会有任何麻烦,使用简单的需求就像我对任何其他库一样。但是,偶尔使用后端的其中一台服务器会获得更新,并且它会停止工作。当我去检查错误时,它始终是相同的 - '要求'传递,但它不是在JavaScript中加载实际的库,而是返回一个空对象({})。在coffeescript中运行代码仍然有效,但无论我做什么 - 重新编译,重新安装所有依赖项,删除和克隆存储库,问题仍然存在。

我已经没有了解自己的想法,所以我希望此前有人遇到过这个问题,并且可能会指出我正确的方向。

在库package.json中:

{ 
    "name": "graph-engine",
    "main": "./lib/graph"
}

在图书馆的graph.coffee中

class Graph
    constructor: () ->
      # Perform init

module.exports = Graph

然后在应用程序的package.json中:

{
    "graph-engine": "git+ssh://git@bitbucket.org:<team>/graph-engine.git"
}

最后,在应用程序本身:

GraphEngine = require "graph-engine"
engineInstance = new GraphEngine()

这在coffeescript中工作正常,但是当使用grunt使用grunt-contrib-coffee的以下设置编译应用程序时:

coffee:
  glob_to_multiple: 
    expand: true
    flatten: false
    cwd: 'src'
    src: ['**/*.coffee']
    dest: 'bin'
    ext: '.js'

在运行已编译的应用程序时无法正确加载库,而是返回空对象。我再次强调,这并不总是发生,因此我没有包含任何代码或json文件,因为我认为它是无关的。

1 个答案:

答案 0 :(得分:0)

虽然这种行为随机性的确切原因使我直到今天,但我发现它与使用CoffeeScript编写的这些库有关。

似乎根据加载顺序,偶尔第三方库会注册咖啡脚本,我自己的库会正确加载,而有时这些库会在我自己的库加载后加载,导致无法加载coffeescript。因此,解决方案结果相当简单 - 注册coffeescript。这可以通过将以下内容放在node.js app的开头来完成:

require('coffee-script/register')

有关详细信息,请参阅documentation