Nodejs + CoffeeScript + Mongoose:定义模块?

时间:2011-12-09 18:46:17

标签: node.js coffeescript mongoose

我正在尝试创建一个小应用程序来存储使用nodejs和mongodb的代码片段 我正在使用Coffeescript来编写应用程序。

问题是,我想将模块中的代码分开 所以我创建了这个文件夹结构

/app
    /lib
        /models
        /routes
    core.coffee

core.coffe是使用expressjs的“服务器”应用程序 所以在这个文件中我有

mongoose = module.exports.mongoose = require 'mongoose'
app      = module.exports.app   = express.createServer()
Snippet  = module.exports.Snippet = require __dirname+'/lib/models/Snippet'
#App configurations
routes  = require(__dirname+'/lib/routes/general')

在lib / models / Snippet中

mongoose = module.parent.exports.mongoose
Snippet = new mongoose.Schema
    title:
        type: String
        default:'Title'

mongoose.model 'Snippet',Snippet
exports.Snippet = mongoose.model 'Snippet'

在/lib/routes/general.coffee

app      = module.parent.exports.app
mongoose = module.parent.exports.mongoose
Snippet  = module.parent.exports.Snippet

app.get '/test', (req,res)->
    snip = new Snippet()
    res.send snip

但这不起作用我收到以下错误消息

TypeError: object is not a function
at Object.CALL_NON_FUNCTION_AS_CONSTRUCTOR (native)

我该如何实现?

2 个答案:

答案 0 :(得分:0)

我看到了一个值得注意的错字:

Snippet  = module.exports.Snippt = require __dirname+'/lib/models/Snippet'

module.exports.Snippt更改为module.exports.Snippet

答案 1 :(得分:0)

让我们先来看看你如何使用require。您似乎正在尝试在core.coffee中加载所有项目的要求,然后将其重新导出到其他位置。这是一种奇怪的方式,大多数人只是require每个模块中需要它们的那些库(至少现在,请参阅我的答案的结尾)。

例如,你需要在lib / models / Snippet中使用mongoose,所以只需要它:

lib / models / Snippet:

mongoose = require 'mongoose'

接下来,没有必要使用__dirname来要求相对路径,要求使用以./开头的路径来应对:

require './lib/models/Snippet'

我仍然无法让代码干净利落(我猜测我们没有看到完整的代码),但这可能足以让您走上正确的道路。


最后,如果您想沿着导出主模块上的所有内容的路线,我可以建议您查看dave-elkan的图层项目。普通版本不支持coffeescript,但我创建了一个fork

它非常轻量级,几乎不会对您的项目结构做出任何假设。基本的想法是,您提供layers()您的快速应用程序对象和目录。图层将扫描该目录并将所有子目录设置为应用程序对象上的图层。

在您的情况下,您传递rootPath: __dirname + '/lib',您的应用对象会在其上添加app.models.Snippetapp.routes.general。这仍然不是我如何构建它,但你可能能够提出一些与你的风格相匹配的东西。