我正在使用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];
  }
};

下面的代码工作完美,当发送一个请求与邮差,我得到以下结果:

如您所见,状态显示为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);
});

如您所见,如果在数组中没有找到用户,我将只设置404状态。

更多关于这个主题的资源/建议是非常欢迎的。


当前回答

对于 IIS

如果您正在使用iisnode通过IIS运行nodejs,请记住,IIS默认会替换您发送的任何错误消息。

这意味着如果您发送res.status(401)。你没有权限查看这个目录或页面。json({消息:"不正确的授权令牌"})

可以通过向web添加以下代码来关闭此行为。<system. Config文件。网络服务器>(来源):

<httpErrors exact =“PassThrough”/>

其他回答

res.status(500).jsonp(dataRes);

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

Body //包含您的数据 头 好吧 状态 statusText 类型 url

在后端,这样做

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')
})

在Frontend中,例如在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)
})

你可以这样做

            return res.status(201).json({
                statusCode: req.statusCode,
                method: req.method,
                message: 'Question has been added'
            });

发送错误响应的最佳方式是返回res.status(400)。发送({消息:'错误已发生'})。

然后,在你的前端,你可以用这样的东西来捕捉它:

        url: your_url,
        method: 'POST',
        headers: headers,
        data: JSON.stringify(body),
    })
        .then((res) => {
            console.log('success', res);
        })
        .catch((err) => {
            err.response && err.response.data && this.setState({ apiResponse: err.response.data })
        })

仅仅记录err将不起作用,因为您发送的消息对象驻留在err.response.data中。

希望有帮助!

你可以这样做:

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

这将把HTTP状态代码设置为400,即使在express 4中也能工作。