24

使用 Azure Functions,您需要做什么才能从用 node.js 编写的函数返回正文中的 JSON 对象?我可以轻松地返回一个字符串,但是当我尝试返回一个如下所示的 json 对象时,我似乎没有返回任何内容。

context.res = {
   body: jsonData,
   contentType: 'application/json'
};
4

6 回答 6

43

基于我最近的测试(2017 年 3 月)。您必须将内容类型显式添加到响应标头以获取 json,否则数据会在浏览器中显示为 XML。

“内容类型”:“应用程序/json”

res = {
    status: 200, /* Defaults to 200 */
    body: {message: "Hello " + (req.query.name || req.body.name)},
    headers: {
        'Content-Type': 'application/json'
    }
};

完整样本如下:

module.exports = function (context, req) {
    context.log('JavaScript HTTP trigger function processed a request.');
    context.log(context);

    if (req.query.name || (req.body && req.body.name)) {
        res = {
            // status: 200, /* Defaults to 200 */
            body: {message: "Hello " + (req.query.name || req.body.name)},
            headers: {
                'Content-Type': 'application/json'
            }
        };
    }
    else {
        res = {
            status: 400,
            body: "Please pass a name on the query string or in the request body"
        };
    }
    context.done(null, res);
};
于 2017-03-22T22:08:44.683 回答
12

如果您的数据是 JS 对象,那么这应该可以工作,例如

module.exports = function(context, req) {
    context.res = {
        body: { name: "Azure Functions" }
    };
    context.done();
};

这将返回一个application/json响应。

相反,如果您将数据保存在 json string中,则可以:

module.exports = function(context, req) {
    context.res = {
        body: '{ "name": "Azure Functions" }'
    };

    context.done();
};

它将返回一个application/json响应,因为它嗅到它是有效的 json。

于 2016-05-11T14:52:33.950 回答
2
module.exports = function (context, req) {
context.log('JavaScript HTTP trigger function processed a request.');

if (req.query.name || (req.body && req.body.name)) {
    context.res = {
        // status: 200, /* Defaults to 200 */
        body: {"data":"Hello"},
        headers: {
            'Content-Type': 'application/json'
        }
    };
}
else {
    // res = {
    //     status: 400,
    //     body: "Please pass a name on the query string or in the request body"
    // };
}
context.done(null,res);
于 2018-04-07T08:24:44.863 回答
1

我想再补充一点。除了制作 body: 一个 JSON 对象之外,请求还应该包含适当的标头,告诉服务器我们感兴趣的内容类型。我可以看到,当刚刚通过浏览器使用 URL 调用相同的 Azure 函数时,会给出 XML 响应,但是从脚本调用时或像 Postman 这样的工具,它提供 JSON。

于 2016-12-18T21:08:57.633 回答
1

我觉得答案已经给出,但没有明确提出,所以我想我也会回答,以防万一它会帮助后面的任何人。我也创建了一个绝对返回 Javascript 对象的函数,但是如果我将 URL 复制并粘贴到 Azure 函数 UI 中,然后在 Chrome 中打开一个新选项卡并尝试查看输出,我实际上会返回一个 XML 文档,它告诉我有一个错误(这并不奇怪,因为 Javascript 中的许多字符会炸毁 XML)。因此,正如其他人所提到的,关键是在您的请求中发送适当的标头。当您将 URL 复制/粘贴到浏览器中时,浏览器会发送一个类似于以下内容的请求标头:

text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/;q=0.8

发生这种情况时,您会看到以下链接中描述的 XML 返回: https ://github.com/strongloop/strong-remoting/issues/118

为了解决这个问题并查看 JSON 请求的数据是什么样子,请使用 Postman 之类的实用程序: https ://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop?hl=en

Accept: application/json

示例邮递员标题设置

或者使用 CURL 命令并传入正确的 Accept 标头。

正如您在上面的屏幕截图中所见,当我提供了正确的标头时,我得到了我期望的 JSON 响应。

于 2017-01-02T07:00:48.433 回答
0

您还可以使用JSON.stringify()从您的 js 对象中生成有效的 json 字符串:

jsonData = { value: "test" }:

context.res = {
   body: JSON.stringify(jsonData)
};
于 2016-10-11T23:08:24.107 回答