0

我遵循了这个例子:Coffeescript 和 node.js 的混淆。需要实例化类?,但它似乎不起作用 - 错误是TypeError: undefined is not a function,所以我一定做错了什么。我有一个简单的咖啡脚本可执行文件。这是我的步骤:

创建文件夹结构:

appmq

  • 我的可执行文件

  • my_class.coffee

  • 包.json

文件内容:

package.json

{
    "name": "appmq",
    "version": "0.0.1",
    "description": "xxxxxx",
    "repository": "",
    "author": "Frank LoVecchio",
    "dependencies": {
    },
    "bin": {"appmq": "./my_executable"}
}

my_executable

#!/usr/bin/env coffee
{CommandLineTools} = require './my_class'
cmdTools = new CommandLineTools()

cmdTools.debug()

my_class

class CommandLineTools

  debug: () ->
    console.log('Version: ' + process.version)
    console.log('Platform: ' + process.platform)
    console.log('Architecture: ' + process.arch)
    console.log('NODE_PATH: ' + process.env.NODE_PATH)

module.exports = CommandLineTools

然后我通过以下方式安装应用程序:

sudo npm install -g

然后我运行应用程序(这会产生我上面提到的错误):

appmq

4

2 回答 2

2

Chris 的回答是正确的,但这与您的类中是否有显式构造函数无关,而是与您要导出的内容无关。

如果你想像这样导出一个类:

module.exports = CommandLineTools

然后,当 you 时require,返回的将是您在module.exports上面分配的内容,即:

CommandLineTools = require './my_class'

这将起作用。您正在做的是以上述方式导出,但您使用的是 CoffeeScript 的解构赋值

{CommandLineTools} = require './my_class'

编译成js:

var CommandLineTools;
CommandLineTools = require('./my_class').CommandLineTools;

失败了,因为require调用不会返回具有属性的对象CommandLineTools,而是返回CommandLineTools自身。现在,如果你想使用上面的解构分配,你必须CommandLineTools像这样导出:

exports.CommandLineTools = CommandLineTools

我希望这会对此事有所启发。否则,请在评论中询问!

于 2012-07-25T10:17:15.760 回答
1

你的类中没有构造函数。交换

{CommandLineTool} = require './my_class'

CommandLineTool = require './my_class'

或编写一个(空)构造函数。

于 2012-07-25T05:49:18.427 回答