2013-09-03 8 views
17

NodeJS(Mongoose & ExpressJS)を使用してREST APIを構築しています。現時点では基本的な構造はかなり良いと思いますが、このようなプロジェクトのベストプラクティスが何であるか不思議です。ExpressJS&Mongoose 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); 
    }); 
}; 

、メソッドの唯一のカップルは、これまで実施されています。あなたはこのアプローチについてどう思いますか?私が改善できるものは何ですか?

また

、小さい側の質問:私はapi\kitten.jsで、ちょうどグローバルapp.jsファイルか何かでそれを必要とする方法があるように(すべてのAPIリソースファイルでマングースを要求する必要が

任意の入力?大歓迎です!

答えて

13

さて、あなたは別のファイルにあなたのルート、DBモデルとテンプレートを分離することができます。 ディレクトリ構造にこのような何かを持って、

| your_app 
| -- routes 
| -- models 
| -- templates 
| -- static 
    | -- css 
    | -- js 
    | -- images 
| -- config.js 
| -- app.js 
| -- url.js 
  • それぞれのマングースモデルには別々のファイルがあります./models
  • テンプレートディレクトリには、翡翠ファイルを置きます。 (テンプレートエンジンとしてjadeを使用していると仮定します)。あなたはHTMLではなくJSONだけを扱っているようですが。 HTMLをレンダリングする場合は、Jadeの使用を検討してください。 DB接続またはサードパーティのAPIキーやもののよう
  • ./staticなど静的なJS、CSSやXMLファイルのディレクトリ
  • 物事がconfig.jsの
  • に入れることができる(ここで template enginesあなたが一緒に行く、他のいくつかを検討することができますされています)
  • url.jsには、引数としてappオブジェクトを表現し、app.getapp.postに一箇所に拡張するプロシージャがあります。

P.S.これは私がExpressで基本的なWebアプリケーションを扱うためのアプローチです。私はこのことを決して最善の方法とは言いませんが、私のコードを維持するのに役立ちます。

6

道はありませんが、私は私の個人的なディレクトリ構造のシードアプリケーションを作成してこれで私のルームメイトを助けました。

あなたはそれのクローンを作成することができます:git clone https://github.com/hboylan/express-mongoose-api-seed.git

またはNPMと:npm install express-mongoose-api-seed

5

codemonger5は、ディレクトリ構造を組織のない正しい方法はありません言ったように。

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

git clone https://github.com/KunalKapadia/express-mongoose-es6-rest-api 
cd express-mongoose-es6-rest-api 
npm install 
npm start 
関連する問題