res.format没有正确选择默认值

时间:2017-01-16 03:14:54

标签: javascript node.js express

我发布的请求时accept标题为"application/json, text/javascript, */*; q=0.01"

但是,尽管有这个标题,但响应总是转到HTML而不是默认值。我在这里错过了什么吗?由于标题不是HTML,因此响应应选择默认值,因为它是唯一的其他选项。

我的代码如下:

res.format({
    html: () => {
        res.status(jsonRes.code).send(jsonRes.msg)
    },
    default: () => {
        res.status(jsonRes.code).send(jsonRes)
    }
})

找到一个解决方案,但这并不能解决我对所发生的事情的误解,所以我不会将其作为答案发布。这会在给定相同标题的情况下成功发送JSON格式的响应。

res.format({
    html: () => {
        res.status(jsonRes.code).send(jsonRes.msg)
    },
    json: () => {
        res.status(jsonRes.code).send(jsonRes)
    },
    default: () => {
        res.status(jsonRes.code).send(jsonRes)
    }
})

1 个答案:

答案 0 :(得分:0)

澄清你的编辑工作原因,以及为什么你真的应该用默认的406回答:

Accept HTTP-header字段不仅告诉了一种可接受的格式,而且还有很多。它还通过订购这些产品来说明更优先的产品。

从你的例子中,客户端说的是这样的:我想要json(application/json),如果你没有,请给我javascript(text/javascript),或给我任何东西你可以给我*/*),但偏好级别很低(;q=0.01)。

您的服务器现在会解析此请求,并提供无法提供application/jsontext/javascript的解决方案,但可以使用*/*来实现html(因为html也是*/*,更具体而不是什么,或者我们无法接受的事情。

Accept字段更像是客户端和服务器之间的协商,如果没有来自快递方的解决方案就可以实现默认情况。

default参数是回答客户端,例如只能解析YAML(接受设置为text/vnd.yaml, text/x-yaml, text/yaml, application/x-yaml,但 */*),以告诉客户端他们认为没有可用的YAML,你应该回答“406 - 不接受”的情况......(也许你还记录了某人想要的yaml而你没有给他们)。

Obligatory link to the specification