web-dev-qa-db-ja.com

ExpressJSとMongoose REST API構造:ベストプラクティス?

NodeJS(Mongoose&ExpressJS)を使用してREST APIを構築しています。現時点ではかなり良い基本構造があると思いますが、ベストプラクティスは何か疑問に思っています。この種のプロジェクトのために。

この基本バージョンでは、すべてがapp.jsファイルを通過します。次に、すべてのHTTPメソッドが、要求されたリソースに渡されます。これにより、APIにリソースを動的に追加でき、それに応じてすべてのリクエストが渡されます。説明する:

// app.js

var express = require('express');
var mongoose = require('mongoose');

var app = express();
app.use(express.bodyParser());

mongoose.connect('mongodb://localhost/kittens');
var db = mongoose.connection;

var resources = [
  'kitten'
];

var repositories = {};

for (var i = 0; i < resources.length; i++) {
  var resource = resources[i];
  repositories[resource] = require('./api/' + resource);
}

db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function callback() {
  console.log('Successfully connected to MongoDB.');

  app.get('/:resource', function (req, res) {
    res.type('application/json');
    repositories[req.params.resource].findAll(res);
  });

  app.get('/:resource/:id', function (req, res) {
    res.type('application/json');
    repositories[req.params.resource].findOne(req, res);
  });

  app.listen(process.env.PORT || 4730);
});

-

// api/kitten.js

var mongoose = require('mongoose');

var kittenSchema = mongoose.Schema({
  name: String
});

var Kitten = mongoose.model('Kitten', kittenSchema);

exports.findAll = function (res) {
  Kitten.find(function (err, kittens) {
    if (err) {
    }
    res.json(kittens);
  });
};

exports.findOne = function (req, res) {
  Kitten.findOne({ _id: req.params.id}, function (err, kitten) {
    if (err) {
    }
    res.json(kitten);
  });
};

明らかに、これまでに実装されたメソッドは2つだけです。このアプローチについてどう思いますか?何か改善できることはありますか?

また、ちょっとした質問:すべてのAPIリソースファイルでマングースを要求する必要があります(api\kitten.jsのように、app.jsファイルなどでグローバルに要求する方法はありますか?

どんな入力でも大歓迎です!

17
thomastuts

さて、あなたはあなたのルート、データベースモデルとテンプレートを異なるファイルに分けることができます。このようなディレクトリ構造を持っている、

| your_app
| -- routes
| -- models
| -- templates
| -- static
    | -- css
    | -- js
    | -- images
| -- config.js
| -- app.js
| -- url.js
  • マングースモデルごとに、./modelsに個別のファイルを配置します
  • テンプレートディレクトリに、jadeファイルを配置します。 (テンプレートエンジンとしてjadeを使用していると仮定します)。 HTMLではなくJSONのみを提供しているように見えますが。 HTMLをレンダリングする場合は、Jadeの使用を検討してください。 (他にもいくつかあります テンプレートエンジン 一緒に行くことを検討できます)
  • ./static静的JS、CSS、XMLファイルなどのディレクトリ。
  • データベース接続やサードパーティのAPIキーなどをconfig.jsに入れることができます
  • Url.jsには、エクスプレスappオブジェクトを引数として取り、app.getapp.postを1か所で拡張するプロシージャがあります。

P.S.これは、Expressの基本的なWebアプリで使用するアプローチです。私はこれが最善の方法だと言っているわけではありませんが、コードを維持するのに役立ちます。

13
Sushant Gupta

rightの方法はありませんが、ルームメイトがこれを利用できるように、個人用ディレクトリ構造のシードアプリケーションを作成しました。

あなたはそれを複製することができます:git clone https://github.com/hboylan/express-mongoose-api-seed.git

またはnpmを使用:npm install express-mongoose-api-seed

6
hboylan

Codemonger5が言ったように、ディレクトリ構造を整理する正しい方法はありません。

ただし、 this ボイラープレートアプリケーションを使用して、Expressを使用してREST APIを作成し、ES6を使用してマングースを作成することができます。本番APIサービスでも同じディレクトリ構造を使用します。

git clone https://github.com/KunalKapadia/express-mongoose-es6-rest-api
cd express-mongoose-es6-rest-api
npm install
npm start
5
Kunal Kapadia