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

duk*_*ble 162 rest http node.js express

我正在玩Nodejs并通过构建一个小的rest API来表达.我的问题是,设置代码状态的好方法/最佳方法是什么,以及响应数据?

让我解释一下代码(我不会把节点和快速代码放到启动服务器,只关注路由器方法):

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];
  }
};
Run Code Online (Sandbox Code Playgroud)

下面的代码工作正常,当使用Postman发送请求时,我得到以下结果: 在此输入图像描述

如您所见,状态显示200,即可.但这是最好的方法吗?有没有我应该自己设置状态,以及返回的JSON?或者总是由快递处理?

例如,我刚刚进行了快速测试并略微修改了上面的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);
});
Run Code Online (Sandbox Code Playgroud)

如您所见,如果在阵列中找不到用户,我将只设置404状态.

有关此主题的更多信息的资源/建议非常受欢迎.

Mic*_*dak 197

Express API参考涵盖了这种情况.

查看状态发送.

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

res.status(500).send({ error: "boo:(" });
Run Code Online (Sandbox Code Playgroud)

  • 如果您只想发送状态代码(无数据),则方法为`res.sendStatus(400);` (22认同)
  • @internet-nico `res.sendStatus(400);` 也发送一个字符串数据,相当于`res.status(400).send('Not Found')` (4认同)
  • 这似乎不再起作用。响应以正确的状态码发送,但没有正文。 (2认同)
  • 忽略我的最后评论。如果将状态设置为204(无内容),则不会发送正文。 (2认同)

mza*_*zar 64

你可以这样做:

res.status(400).json(json_response);
Run Code Online (Sandbox Code Playgroud)

这会将HTTP状态代码设置为400,即使在快速4中也可以.

  • `express deprecated res.json(status,obj):使用res.status(status).json(obj)代替`所以,`res.status(400).json(json_response)`现在是准确的. (14认同)

Jor*_*ias 35

当使用的200状态将是默认的res.send,res.json等等.

您可以设置状态 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
});
Run Code Online (Sandbox Code Playgroud)

然后让我的错误中间件发送响应,并在发生错误时做我需要做的任何事情.

另外:res.sendStatus(status)自版本4.9.0 开始添加http://expressjs.com/4x/api.html#res.sendStatus


cml*_*ndz 18

HTTP状态代码列表

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

Stripe的 API在现实世界中表现相似.

200, {status: 200, data: [...]}
Run Code Online (Sandbox Code Playgroud)

错误

400, {status: 400, data: null, message: "You must send foo and bar to baz..."}
Run Code Online (Sandbox Code Playgroud)


mrk*_*rks 13

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

app.get('/', function (req, res) {
    res.status(200).json({
        message: 'Welcome to the project-name api'
    });
});
Run Code Online (Sandbox Code Playgroud)


Was*_*siF 7

获取包含以下属性的完整 HttpResponse 的标准方法

  1. body //包含你的数据
  2. 标题
  3. 好的
  4. 地位
  5. 状态文本
  6. 类型
  7. 网址

后端,执行此操作

router.post('/signup', (req, res, next) => {
    // res object have its own statusMessage property so utilize this
    res.statusText = 'Your have signed-up succesfully'
    return res.status(200).send('You are doing a great job')
})
Run Code Online (Sandbox Code Playgroud)

前端,例如 in Angular,只需执行以下操作:

let url = `http://example.com/signup`
this.http.post(url, { profile: data }, {
    observe: 'response' // remember to add this, you'll get pure HttpResponse
}).subscribe(response => {
    console.log(response)
})
Run Code Online (Sandbox Code Playgroud)