web-dev-qa-db-fra.com

Comment renvoyer un objet JSON à partir d'une fonction Azure avec Node.js

Avec Azure Functions, que devez-vous faire pour renvoyer un objet JSON dans le corps à partir d'une fonction écrite dans node.js? Je peux facilement retourner une chaîne, mais lorsque j'essaie de retourner un objet json comme indiqué ci-dessous, il semble que rien ne soit retourné.

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

Basé sur mes tests récents (mars 2017). Vous devez ajouter explicitement le type de contenu aux en-têtes de réponse pour récupérer json, sinon les données s'affichent en XML dans le navigateur.

"Content-Type": "application/json"

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

Échantillon complet ci-dessous:

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

Si vos données sont un objet JS, cela devrait fonctionner, par exemple.

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

Cela renverra un application/json réponse.

Si à la place vous avez vos données dans un json string, vous pouvez avoir:

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

    context.done();
};

Qui renverra un application/json réponse car il renifle qu'il est valide 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

Je voudrais ajouter un point de plus. En plus de créer le corps: un objet JSON, la demande doit également contenir des en-têtes appropriés indiquant au serveur ce que type de conten nous sommes intéressés. Je pouvais voir cette même fonction Azure lorsqu'elle était invoquée via un navigateur en utilisant une URL donnant XML réponse, mais lors de l'appel à partir d'un script ou d'outils comme Postman, il donne JSON.

1

J'ai l'impression que la réponse a été donnée, mais elle n'a pas été clairement présentée, alors j'ai pensé que je répondrais également au cas où cela aiderait quelqu'un à venir derrière moi. Moi aussi, j'ai créé une fonction qui renvoie très certainement un objet Javascript, mais si je copie et colle l'URL dans l'interface utilisateur de la fonction Azure et que j'ouvre un nouvel onglet dans Chrome et essaie d'afficher la sortie, En fait, je récupère un document XML qui me dit qu'il y a une erreur (il n'est pas surprenant qu'il y ait une erreur car de nombreux caractères dans le Javascript auraient fait exploser le XML). Donc, comme d'autres l'ont mentionné, la clé envoie les en-têtes appropriés avec votre demande Lorsque vous copiez/collez l'URL dans votre navigateur, le navigateur envoie un en-tête de demande semblable à celui-ci:

text/html, application/xhtml + xml, application/xml; q = 0,9, image/webp, /; q = 0,8

Lorsque cela se produit, vous voyez le retour XML comme décrit dans ce lien: https://github.com/strongloop/strong-remoting/issues/118

Pour contourner ce problème et voir à quoi ressembleraient les données avec une demande JSON, utilisez un utilitaire comme Postman: https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop?hl = en

Accept: application/json

Sample Postman Header Settings

Ou utilisez une commande CURL et passez l'en-tête Accept approprié.

Comme vous pouvez le voir dans la capture d'écran ci-dessus, lorsque j'ai fourni l'en-tête approprié, je récupère la réponse JSON à laquelle je m'attendais.

1
Allen Underwood

Vous pouvez également utiliser JSON.stringify () pour créer une chaîne json valide à partir de votre objet js:

jsonData = { value: "test" }:

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