2017-03-01 14 views
0

express.jsを使用してREST APIを構築しています。express.js APIエンドポイントCRUDのベストプラクティス

私のAPIは、「ユーザー」のCRUDを行うには、すべてのエンドポイントを提供する必要があるので、私はこれまでのところ、次のいる:

app.get('/users', getAllUsers); // get all users 
app.post('/users', createUser); // create a new user 
app.put('/users', updateUser); // update a user 
app.delete('/users', deleteUser); // delete a user 

しかし、いただきました!良い練習エンドポイントを単一のユーザーを取得するには?

は、理想的には、あなたが/users/1234に乗る場合、私は唯一のID 1234でユーザーを返す必要がありますが、私はちょうど/usersをすればIDが検出されなかったように私はすべてのユーザーを返す必要があります。

は、どのように私は私をリファクタリングすることができます

app.get('/users', getAllUsers);

両方のケースを処理するために?

答えて

5

に行くことを好むだろう。これはExpress documentationの推奨アプローチです。

var express  = require('express'); 

var app   = express(); 
var usersRouter = express.Router(); 

usersRouter.get('/', function(req, res) { 
    res.send('Got all users'); 
}); 

usersRouter.get('/:id', function(req, res) { 
    res.send('Got user ' + req.params.id); 
}); 

app.use('/users', usersRouter); 
+0

私の見解では最高の答え、 –

+0

私はこれが好きです。それは最もクリーンな解決策です。 – newbreedofgeek

+0

@newbreedofgeekあなたの問題を解決する答えがあれば、それを受け入れることを忘れないでください。 :) –

1

可能な限りルート操作を分離することはできません。単一のIDを取得するには、そのようなルートはそのデータだけを取得する必要があります。 例。

var router = express.Router(); 
router.route('some/route/id/123').get(function(req,res){ 

console.log('id'); 
}); 
router.route('some/route/all').get(function(req,res){ 

console.log('all'); 
}); 
+0

質問の次の図は意味がありますか? – Remario

1

あなたは、オプションのparamとしてIDを提供し、コントローラ機能などのため

にそれをチェックすることによって、そうすることができます。

app.get('/users/:id?', getAllUsers); 

しかし、私はあなたがより高いレベルのルーターを作成し、それにapp.use()/router.use()を呼び出すことができ、単一責任の原則

app.get('/users', getAllUsers); 
app.get('/users/:id', getUser); 
+0

私はこのようなことをした。これはカスケードダウンですか?つまり、/ users/123を送信すると、/ usersルート(getAllUsers)をスキップしてgetUserのみにヒットします。私はそれを交換し、getUser()メソッドで "id"が定義されていない場合はnext()を呼び出す。getAllUsers()に行く – newbreedofgeek

関連する問題