Ответ 1
Когда я впервые попал в Node.js, Express и Mongoose, я боролся с масштабированием моего кода. Цель моего ответа - помочь кому-то, кто работает не только с простым блогом, но и с помощью еще большего масштабируемого проекта.
- Я всегда подключен к базе данных, я не открываю и не закрываю соединения при необходимости
- Я использую
index.js
в качестве корневого файла папки, как это было бы на других языках - хранятся в своих документах и
require()
d в файлеmodels/index.js
. Маршруты - аналогичны моделям, каждый уровень маршрута имеет папку, у которой в свою очередь есть файл
index.js
. Так что легко устроить что-то вродеhttp://example.com/api/documents/:id
. Это также имеет смысл, когда вы просматриваете структуру файла.
Здесь структура того, что я использую:
-- app.js
-- models/
---- index.js
---- blog.js
-- mongoose/
---- index.js
-- routes/
---- index.js
---- blog/index.js
-- public/
-- views/
---- index.{your layout engine} => I use Jade.lang
-- methods/
---- index.js => use if you'd rather write all your functions here
---- blog.js => can store more complex logic here
app.js
var db = require('./mongoose'),
express = require('express');
// note that I'm leaving out the other things like 'http' or 'path'
var app = express();
// get the routes
require('./routes')(app);
// I just require routes, without naming it as a var, & that I pass (app)
мангуст /index.js
// Mongoose connect is called once by the app.js & connection established
// No need to include it elsewhere
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/blog');
// I have just connected, and I'm not exporting anything from here
модели /index.js
// Logic here is to keep a good reference of what used
// models
Blog = require('./blog');
// User = require('./user');
// exports
exports.blogModel = Blog.blogModel;
// exports.userModel = User.userModel;
модели /blog.js
Итак, для каждой модели, над которой вы работаете, вы создаете документ model.js
и добавляете его в models/index.js
выше. В качестве примера я добавил модель User
, но прокомментировал ее.
// set up mongoose
var mongoose = require('mongoose');
var Schema = mongoose.Schema,
ObjectId = Schema.ObjectId;
var BlogSchema = Schema({
header: {type: String },
author: {type: String },
text: {type: String },
_id: { type: ObjectId } // not necessary, showing use of ObjectId
});
Blog = mongoose.model('Blog', BlogSchema);
// the above is necessary as you might have embedded schemas which you don't export
exports.blogModel = Blog;
маршруты /index.js
module.exports = function(app) {
app.get('/', function(req, res) {
// do stuff
});
require('./blog')(app);
// other routes entered here as require(route)(app);
// we basically pass 'app' around to each route
}
маршруты/блог/index.js
module.exports = function(app) {
app.get('/blog', function(req, res) {
// do stuff
});
require('./nested')(app);
// this is for things like http://example.com/blog/nested
// you would follow the same logic as in 'routes/index.js' at a nested level
}
предлагаемое использование
- : для создания логики, связанной с документами, то есть создания, обновления, удаления и поиска.
- маршруты: минимальное кодирование, только там, где мне нужно анализировать данные HTTP, создавать экземпляры моделей, а затем отправлять запросы к соответствующей модели.
- : для более сложной логики, которая напрямую не связана с моделями. В качестве примера у меня есть папка
algorithms/
, где хранятся все алгоритмы, которые я использую в своем приложении.
Надеюсь, что это дает больше ясности. Эта структура творит чудеса для меня, поскольку мне легко следовать.