2011-12-09 86 views
0

我想創建一個小應用程序來存儲代碼片段使用nodejs和mongodb 我正在使用Coffeescript來編寫應用程序。Nodejs + CoffeeScript + Mongoose:定義模塊?

的問題是,我想在模塊 的代碼分開,所以我創建這個文件夾結構

/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 /模型/片段

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) 

我怎樣才能做到呢?

+0

你在哪裏得到'TypeError'?在'snip = new Snippet()'? –

+0

是的!正是這條線。 – matiasfh

+0

您是否檢查過'require __dirname +'/ lib/models/Snippet'正在'core.coffee'中返回一個函數? –

回答

0

我看到一個值得注意的錯字:

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

變化module.exports.Snipptmodule.exports.Snippet

+0

在這裏是一個錯字.. ..我解決這個問題 – matiasfh

0

讓我們先看看你如何使用require。看起來你正在嘗試將所有項目的需求加載到core.coffee中,然後將它們重新導出到別處。這是一種奇怪的做法,大多數人只需require那些需要它們的模塊中的那些庫(至少現在看到我的答案結束)。

例如,你需要的lib /模型貓鼬/片段,所以只需要在那兒:

的lib /模型/段:

mongoose = require 'mongoose' 

下,有沒有必要使用__dirname要求相對路徑,需要科佩斯細跟的路徑開始./

require './lib/models/Snippet' 

我還是沒能得到的代碼乾淨工作(我猜測我們沒有看到完整的代碼),但它可能足以讓你在正確的道路上。


最後,如果你想下去主模塊上出口的一切途徑可以,我建議考慮看看戴夫 - 埃爾肯的層項目。普通版本不支持coffeescript,但我創建了一個fork

它非常輕巧,並且幾乎不會對您的項目結構進行假設。基本的想法是,你給layers()你的快遞應用程序對象和目錄。圖層將掃描該目錄並將任何子目錄設置爲應用程序對象上的圖層。

在你的情況下,你會通過一個rootPath: __dirname + '/lib',你的應用程序對象將得到app.models.Snippetapp.routes.general添加到它。這仍然不是我如何構造它的方式,但是您可能會從中找出與您的風格相匹配的東西。