3


ここでスタックオーバーフローに関する私の最初の質問です答えを見つけるために何年も使用してきましたが、今は少しガイダンスが必要です。私は、ノードとエクスプレス、およびアプリを構造化する非同期の方法が初めてです。

目標 - 検証と 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);

データベース
この質問/回答により、変更を加えた小さなデータベース モジュールを作成することができました。 ノードエクスプレスアプリケーションでオブジェクトをどのように渡しますか?
あまり注目されていません。たぶん、それは非常に明白であるか、良い答えではないからです。

複数のコレクションを取得すると、それらはすべて起動時に初期化されますが、モジュールが必要とするすべての場合は単一のコレクションを要求でき、別のモジュールが必要とする場合は 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;

Router
ここでは User Model を必要とし、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