【问题标题】:Nodejs + CoffeeScript + Mongoose : Define Module?Nodejs + CoffeeScript + Mongoose:定义模块?
【发布时间】:2012-01-17 00:33:33
【问题描述】:

我正在尝试创建一个小应用程序来使用 nodejs 和 mongodb 存储代码的 sn-ps 我正在使用 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)

我怎样才能做到这一点?

【问题讨论】:

  • 你从哪里得到TypeError?在snip = new Snippet()?
  • 您是否检查过require __dirname+'/lib/models/Snippet' 正在返回core.coffee 中的函数?

标签: node.js coffeescript mongoose


【解决方案1】:

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

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

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

【讨论】:

  • 这里打错字了.. .. 我改正了
【解决方案2】:

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

例如,您需要在 lib/models/Snippet 中使用 mongoose,因此只需在此处需要它:

lib/models/片段:

mongoose = require 'mongoose'

接下来,不需要使用__dirname 来要求相对路径,require 可以很好地处理以./ 开头的路径:

require './lib/models/Snippet'

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


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

它非常轻量级,几乎不对您的项目结构做出任何假设。基本思想是你给layers()你的快递应用对象和一个目录。图层将扫描该目录并将任何子目录设置为您的应用程序对象上的图层。

在您的情况下,您将传入rootPath: __dirname + '/lib',您的应用程序对象将添加app.models.Snippetapp.routes.general。这仍然不是我的结构,但你也许可以从那里想出与你的风格相匹配的东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-27
    • 2013-07-21
    • 1970-01-01
    • 2012-04-15
    • 1970-01-01
    • 2015-09-29
    • 1970-01-01
    • 2019-01-15
    相关资源
    最近更新 更多