2017-10-20 41 views
1

J'essaie d'ouvrir, de lire et de renvoyer un fichier HTML à l'aide des fonctions Azure. Je développe localement et les journaux indique que la fonction exécutée avec succès cependant sur le navigateur j'obtiens 500 erreur de serveur interne. Est-ce que je fais quelque chose de mal ici?Erreur lors du traitement des fichiers HTML à partir d'une fonction Azure

const fs = require('fs'); 
const path = require('path'); 
const mime = require('../node_modules/mime-types'); 
module.exports = function (context, req) { 
    const staticFilesFolder = 'www/build/'; 
    const defaultPage = 'index.html'; 
    getFile(context, req.query.file); 
    function getFile(context, file) { 
     const homeLocation = process.env["HOME"]; 
     if(!file || file == null || file === undefined){ 
      context.done(null,{status:200,body:"<h1>Define a file</h1>",headers:{ 
       "Content-Type":" text/html; charset=utf-8" 
      }}); 
     } 
     fs.readFile(path.resolve(path.join(homeLocation, staticFilesFolder, file)), 
      (err, htmlContent) => { 
       if (err) { 
        getFile(context, "404.html"); 
       } 
       else { 
        const res = { 
         status: 200, 
         body: htmlContent, 
         headers:{ 
          "Content-Type": mime.lookup(path.join(homeLocation, staticFilesFolder, file)) 
         } 

        } 
        context.done(null,res); 
       } 
      }) 
    } 

}; 

Remarque je suis sûr qui existe 404.html et existe index.html. Lorsque je consigne le contenu de htmlContent, la sortie est correcte.

functions.json

{ 
    "disabled": false, 
    "bindings": [ 
    { 
     "authLevel": "anonymous", 
     "type": "httpTrigger", 
     "direction": "in", 
     "methods":["get"], 
     "route":"home", 
     "name": "req" 
    }, 
    { 
     "type": "http", 
     "direction": "out", 
     "name": "res" 
    } 
    ] 
} 

Réponse sur Chrome

Response on Chrome with "Content-Length"

Si j'enlevé en-tête "Content-Length" les modifications du code d'état 406.

Response on Chrome without "Content-Length"

Mise à jour 1 Le code semble fonctionner normalement sur Azure Portal, mais il ne fonctionne pas lorsque vous l'exécutez localement.

+0

juste essayé votre code et il fonctionne très bien pour moi (sur place/azur). Avez-vous essayé de le déployer sur azur? –

+0

Je viens de l'essayer sur Azure Portal et ça marche très bien. Cependant, il ne fonctionne toujours pas localement pour une raison quelconque. –

+0

Qu'est-ce que le contenu "index.html"? Les erreurs locales ont-elles des messages (onglet Response dans l'outil chrome "network")? –

Répondre

0

On dirait que vous regroupez deux méthodes de retour des données à partir d'une http déclenchée fonction (context.res et context.done()): https://docs.microsoft.com/en-us/azure/azure-functions/functions-reference-node#accessing-the-request-and-response

Puisque vous utilisez context.res, essayez de supprimer context.done();

+0

Merci mais en supprimant context.done(); fait fonctionner la fonction indéfiniment. J'ai aussi essayé d'utiliser context.done (null, res) et de placer la propriété "name" dans la liaison de sortie à "$ return" et j'obtiens le même résultat que j'ai indiqué dans ma question. –

0

Vous faites une utilisation incorrecte De context.res, vous ne devez pas l'écraser mais utiliser les méthodes fournies par la classe Response fournie dans le worker Azure NodeJS. Si vous utilisez VSCode, vous obtiendrez intellisense pour ces méthodes. Sinon, voir: https://github.com/Azure/azure-functions-nodejs-worker/blob/dev/src/http/Response.ts

Votre code devrait ressembler à ceci à la place.

context.res.setHeader('content-type', 'text/html; charset=utf-8') 
context.res.raw(htmlContent) 

En utilisant context.res.raw ou context.res.send sera déjà effectuer l'appel context.done pour vous.

Assurez-vous d'utiliser content-type=text/html; charset-utf8 au lieu de content-type=text/html ou vous risquez de provoquer un problème avec le type de contenu renvoyé. Au lieu de retourner content-type=text/html vous finissez par obtenir content-type=text/plain qui échouera à rendre votre code HTML.

Adressé sur: https://github.com/Azure/azure-webjobs-sdk-script/issues/2053