web-dev-qa-db-ja.com

Node.jsでAzure関数からJSONオブジェクトを返す方法

Azure Functionsで、node.jsに記述された関数から本文のJSONオブジェクトを返すために何をする必要がありますか?文字列は簡単に返すことができますが、以下に示すようにjsonオブジェクトを返そうとすると、何も返されないように見えます。

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

私の最近のテスト(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);
};
26
spooky

データが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();
};

有効なjsonであることをスニッフィングするため、application/json応答を返します。

11
David Ebbo
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);
1

もう一点申し上げたいと思います。本文の作成とは別に、JSONオブジェクトには、リクエストに適切なヘッダーを含めて、サーバーにどの content type に興味があるかを伝える必要があります。URLを使用してブラウザー経由で呼び出すと、同じAzure関数がXML応答ですが、スクリプトまたはPostmanなどのツールから呼び出すと、JSONが返されます。

答えは出たような気がしますが、はっきりとは出ていないので、誰かが後ろに来るのを助けてくれるので、答えてもいいと思いました。私もJavascriptオブジェクトを確実に返す関数を作成しましたが、Azure関数UIにURLをコピーして貼り付け、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

Sample Postman Header Settings

または、CURLコマンドを使用して、適切なAcceptヘッダーを渡します。

上のスクリーンショットでわかるように、適切なヘッダーを指定すると、期待どおりのJSON応答が返されます。

1
Allen Underwood

JSON.stringify()を使用して、jsオブジェクトから有効なjson文字列を作成することもできます。

jsonData = { value: "test" }:

context.res = {
   body: JSON.stringify(jsonData)
};
0
David Leitner