我正在尝试创建一个小应用程序来存储使用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)
我该如何实现?
答案 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.Snippet
和app.routes.general
。这仍然不是我如何构建它,但你可能能够提出一些与你的风格相匹配的东西。