2017-03-01 106 views
0

我正在使用express.js構建REST API。express.js CRUD的API端點最佳實踐

我的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

您可以創建一個更高級別的路由器,然後調用app.use()/router.use()就可以了。這是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

您可以通過提供ID作爲可選PARAM和檢查,在控制器功能

對於如這樣做。

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

但我寧願去與單一職責原則

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

我最終做了這樣的事情。這是否會級聯?即,如果我發送/ users/123,它會跳過/用戶路由(getAllUsers),並且只打(getUser)。我換了它,並在我的getUser()方法,如果「ID」未定義我打電話next()..然後去getAllUsers() – newbreedofgeek