База данных Express.js и логика проверки. Куда?
Ничего важного
Мой первый вопрос здесь о stackru. Я использовал это в течение многих лет, чтобы найти ответы, но теперь мне нужно немного руководства. Я новичок в узле и выразить и асинхронный способ структурирования приложения.
Цель - интерфейс REST с валидацией и базой данных neDB
Я получил следующий код работает. POST новый пользователь является единственным маршрутом. Это основано на множестве ответов и советов. Мне трудно выстроить логику, получить структуру, на которой можно строить.
Я совсем не уверен, является ли эта структура дерьмом или нет. Любой совет будет принят во внимание.
Основной файл инициализирует базу данных, средство проверки промежуточного программного обеспечения и запускает приложение.
// rest.js
var express = require('express'),
bodyParser = require('body-parser'),
validator = require('express-validator'),
db = require('./database/db'),
userRouter = require('./routers/users');
db.init();
var app = express();
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
app.use(validator());
app.use('/api/users', userRouter);
var port = process.env.PORT || 8080;
app.listen(port);
База данных
Этот вопрос / ответ заставил меня создать небольшой модуль базы данных с изменениями. Как вы передаете объекты вокруг приложения Express?
Это не так много внимания. Может быть, потому что это очень очевидно, или, может быть, не очень хороший ответ.
Идея состоит в том, что когда я получаю несколько коллекций, все они инициализируются при запуске, но я могу запросить одну коллекцию, если это все, что нужно модулю, или я могу вернуть весь объект db, если этого требует другой модуль.
// database/db.js
var nedb = require('nedb');
var db = {};
db.init = function() {
db.users = new nedb({ filename: './database/data/users', autoload: true });
db.users.ensureIndex({ fieldName: 'username', unique: true }, function (err) {});
db.users.ensureIndex({ fieldName: 'email', unique: true }, function (err) {});
};
db.get = function(collection) {
if (collection && db[collection])
return db[collection];
return db;
}
module.exports = db;
маршрутизатор
Здесь мне требуется Модель пользователя, я использую экспресс-валидатор и очищает запрос перед передачей его в модель на основе минималистической схемы ключей в модели. У меня нет никаких контроллеров. Если бы я имел (или когда я делаю), я бы положил подтверждение там. Маршрутизатор должен отправлять ответ и статус правильно?
// routers/users.js
var express = require('express'),
_ = require('lodash'),
User = require('../models/user');
var userRouter = express.Router();
userRouter.route('/')
.post(function(req, res) {
req.checkBody('username', 'Username must be 3-20 chars').len(3,20);
req.checkBody('email', 'Not valid email').isEmail();
req.checkBody('password', 'Password must be 6-20 chars').len(6,20);
var err = req.validationErrors();
if (err) {
res.status(422).send(err);
return;
}
var data = _.pick(req.body, _.keys(User.schema));
User.create(data, function (err, newData) {
if (err) {
res.status(409).send(err);
} else {
res.status(201).send(newData);
}
});
});
module.exports = userRouter;
модель
Модель требует модуль базы данных и получает "соединение". Это нормально?
// models/user.js
var db = require('../database/db');
var User = function (data) {
this.data = data;
};
User.schema = {
_id: null,
username: null,
email: null,
password: null
};
User.create = function (data, callback) {
db.get('users').insert(data, callback);
};
module.exports = User;
Спасибо за чтение этого далеко. Теперь мой вопрос: есть ли что-то принципиально неправильное в этой настройке, касающееся использования базы данных и логики проверки. Я знаю, что модель выглядит глупо:)