Nodejs + CoffeeScript + Mongoose: определить модуль? - PullRequest
0 голосов
/ 09 декабря 2011

Я пытаюсь создать небольшое приложение для хранения фрагментов кода, используя 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 голосов
/ 08 февраля 2015

Давайте начнем с рассмотрения того, как вы используете require.Похоже, вы пытаетесь загрузить все требования проекта в core.coffee, а затем реэкспортировать их в другое место.Это странный способ сделать это, большинство людей просто require используют те библиотеки в каждом модуле, которые в них нуждаются (по крайней мере, пока смотрите конец моего ответа).

Например, вам нужен mongoose в lib/ models / Snippet, поэтому просто потребуйте его там:

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.Это все еще не совсем так, как я бы это структурировал, но вы можете найти что-то, что соответствует вашему стилю.

0 голосов
/ 09 декабря 2011

Я вижу заслуживающую внимания опечатку:

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

Измените module.exports.Snippt на module.exports.Snippet.

...