没什么重要的
我在这里关于stackoverflow的第一个问题。我已经用它多年来寻找答案,但现在我需要一些指导。我是节点和表达的新手,也是构建应用程序的异步方式。
目标 - 具有验证和neDB数据库的REST接口
我得到以下代码工作。 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);
数据库
这个问题/答案让我创建了带有改动的小型数据库模块。
How do you pass objects around node express application?
它没有太多关注。也许是因为它非常明显或者可能不是一个好的答案。
我的想法是,当我获得多个集合时,它们都会在启动时初始化,但如果需要所有模块,我可以请求单个集合,或者如果另一个模块需要,我可以返回整个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;
路由器
我在这里需要用户模型并使用express-validator并在将请求传递给模型之前根据模型中的极简主义模式清理请求。我没有任何控制器。如果我(或当我这样做),我会在那里进行验证。路由器应该发送响应和状态吗?
// 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;
感谢您阅读此内容。现在,我的问题是: 关于数据库使用和验证逻辑,此设置是否存在根本性问题。我知道模型看起来很愚蠢:)