正确的方法来设置响应状态和JSON内容的REST API使用nodejs和express

我正在玩Nodejs,并通过构build一个小的restAPI来expression。 我的问题是,设置代码状态以及响应数据的最佳做法/最佳方法是什么?

让我用一点代码解释一下(我不会把启动服务器所需的节点和expression式代码,只是所关心的路由器方法):

router.get('/users/:id', function(req, res, next) { var user = users.getUserById(req.params.id); res.json(user); }); exports.getUserById = function(id) { for (var i = 0; i < users.length; i++) { if (users[i].id == id) return users[i]; } }; 

下面的代码完美的工作,当发送邮递员的请求时,我得到以下结果: 在这里输入图像描述

正如你所看到的,状态显示200,这是OK的。 但这是做到这一点的最好方法吗? 有没有这样的情况,我应该自己设置状态,以及返回的JSON? 还是总是用快递处理?

例如,我刚做了一个快速testing,稍微修改了上面的get方法:

 router.get('/users/:id', function(req, res, next) { var user = users.getUserById(req.params.id); if (user == null || user == 'undefined') { res.status(404); } res.json(user); }); 

正如你所看到的,如果用户没有在数组中find,我将只设置404的状态。

资源/build议,以了解更多关于这个话题是值得欢迎的。

Express API参考涵盖了这种情况: http : //expressjs.com/4x/api.html#res.send 。

简而言之,在调用jsonsend之前,您只需调用status方法:

 res.status(500).send({ error: "boo:(" }); 

当使用res.sendres.json等时,200的状态将成为默认值。

你可以设置状态像res.status(500).json({ error: 'something is wrong' });

我经常会做点像…

 router.get('/something', function(req, res, next) { // Some stuff here if(err) { res.status(500); return next(err); } // More stuff here }); 

然后让我的错误中间件发送响应,并在发生错误时执行其他任何我需要的操作。

另外: res.sendStatus(status)已被添加到版本4.9.0 http://expressjs.com/4x/api.html#res.sendStatus

你可以这样做:

 res.status(400).json(json_response); 

这会将HTTP状态码设置为400,即使在快递4中也是如此。

我build议阅读REST-ful URI Design和一个HTTP状态码列表

有关状态响应的良好做法是,根据错误发送正确的HTTP状态代码(客户端错误4xx,服务器错误5xx),关于实际的JSON响应,没有“圣经”,但一个好主意可能是在成功的响应中发送(再次)作为根对象的2个不同属性的状态和数据(这样你就可以让客户端有机会从HTTP头部有效载荷本身捕获状态)以及解释在出现错误的情况下以人类可以理解的方式出错。

Stripe的 API在现实世界中的行为类似。

 200, {status: 200, data: [...]} 

错误

 400, {status: 400, data: null, message: "You must send foo and bar to baz..."} 

我在我的Express.js应用程序中使用这个:

 app.get('/', function (req, res) { res.status(200).json({ message: 'Welcome to the project-name api' }); }); 
 res.status(500).jsonp(dataRes);