我按照这个示例:Coffeescript and node.js confusion. require instantiates class?,但它似乎不起作用 - 错误是TypeError: undefined is not a function
,所以我一定做错了。我有一个简单的咖啡脚本可执行文件。以下是我的步骤:
创建文件夹结构:
appmq
my_executable
my_class.coffee
的package.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
答案 0 :(得分:2)
克里斯的答案是正确的,但这与你班上是否有明确的构造函数无关,而是与你的导出内容有关。
如果要导出这样的单个类:
module.exports = CommandLineTools
然后,当您require
时,返回的内容将是您在上面module.exports
分配的内容,即:
CommandLineTools = require './my_class'
这将有效。您正在做的是以上述方式导出,但您正在使用CoffeeScript的destructuring assignment:
{CommandLineTools} = require './my_class'
编译为js:
var CommandLineTools;
CommandLineTools = require('./my_class').CommandLineTools;
哪个失败,因为require
调用不会返回一个属性为CommandLineTools
的对象,而是CommandLineTools
本身。现在,如果你想使用上面的解构分配,你必须像这样导出CommandLineTools
:
exports.CommandLineTools = CommandLineTools
我希望这会对此事有所了解。否则,请在评论中提出要求!
答案 1 :(得分:1)
你班上没有构造函数。交换
{CommandLineTool} = require './my_class'
与
CommandLineTool = require './my_class'
或写一个(空)构造函数。