2017-03-01 65 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