3

没什么重要
的我在stackoverflow上的第一个问题。我多年来一直使用它来寻找答案,但现在我需要一些指导。我是 node 和 express 以及构建应用程序的异步方式的新手。

目标 - 带有验证和 neDB 数据库的 REST 接口
我得到了以下代码。POST 一个新用户是唯一的途径。它是基于许多答案和 tuts 混合在一起的。我发现很难搭建逻辑框架,以获得可以构建的结构。

我完全不确定这种结构是否是垃圾。任何意见,将不胜感激。

主文件正在初始化数据库、中间件验证器并启动应用程序。

// 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);

数据库
这个问题/答案让我创建了带有改动的小型数据库模块。 你如何在 node 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;

路由器
我在这里需要用户模型,并使用 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;

感谢您阅读本文。现在,我的问题是:关于数据库使用和验证逻辑,此设置是否存在根本性错误。我知道这个模型看起来很愚蠢:)

4

0 回答 0