2017-10-20 2 views
1

Ich versuche, HTML-Dateien mithilfe von Azure-Funktionen zu öffnen, zu lesen und zurückzugeben. Ich entwickle lokal und die Logs sagen, dass die Funktion erfolgreich ausgeführt wurde aber auf dem Browser bekomme ich 500 interne Serverfehler. Mache ich hier etwas falsch?Fehler beim Bereitstellen von HTML-Dateien aus einer Azure-Funktion

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); 
       } 
      }) 
    } 

}; 

Hinweis Ich bin sicher, dass 404.html existiert und index.html existiert. Wenn ich den Inhalt von htmlContent logge, gibt es die korrekte Ausgabe.

functions.json

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

Antwort auf Chrome

Response on Chrome with "Content-Length"

Wenn ich "Content-Length" entfernt, um die Statuscode ändert Header auf 406.

Response on Chrome without "Content-Length"

Update 1 Der Code scheint normal auf Azure Portal ausgeführt zu werden, funktioniert jedoch nicht, wenn er lokal ausgeführt wird.

+0

versucht einfach Ihren Code und es funktioniert gut für mich (lokal/Azurblau). Haben Sie versucht, es in azurblau zu stellen? –

+0

Ich habe es gerade auf Azure Portal versucht und es funktioniert gut. Aus irgendeinem Grund funktioniert es jedoch immer noch nicht lokal. –

+0

Was ist "index.html" Inhalt? Haben lokale Fehler Nachrichten (Response-Registerkarte in Chrome "Netzwerk" -Tool)? –

Antwort

0

Es sieht aus wie Sie die Kombination von zwei Methoden der Daten aus einer http Rückkehr ausgelöst Funktion (context.res und context.done()): https://docs.microsoft.com/en-us/azure/azure-functions/functions-reference-node#accessing-the-request-and-response

Da Sie context.res verwenden, versuchen zu entfernen context.done();

+0

Danke aber context.done() entfernen; Lässt die Funktion unbegrenzt laufen. Ich versuchte auch, context.done (null, res) zu verwenden und die "name" -Eigenschaft in der Ausgabebindung auf "$ return" zu setzen, und ich bekomme das gleiche Ergebnis, wie ich in meiner Frage angegeben habe. –

0

Sie machen eine falsche Verwendung von context.res sollten Sie es nicht überschreiben, sondern stattdessen die Methoden verwenden, die von der Response-Klasse im Azure NodeJS-Worker bereitgestellt werden. Wenn Sie VSCode verwenden, erhalten Sie intellisense für diese Methoden. Ansonsten siehe: https://github.com/Azure/azure-functions-nodejs-worker/blob/dev/src/http/Response.ts

Ihr Code sollte stattdessen in etwa so aussehen.

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

Mit context.res.raw oder context.res.send wird bereits für Sie die context.done Anruf durchführen.

Stellen Sie sicher, dass Sie content-type=text/html; charset-utf8 anstelle von content-type=text/html verwenden, sonst lösen Sie ein Problem mit dem zurückgegebenen Inhaltstyp aus. Anstatt content-type=text/html zurückzugeben, bekommst du content-type=text/plain, die deinen HTML nicht wiederholen können.

Adressiert an: https://github.com/Azure/azure-webjobs-sdk-script/issues/2053

Verwandte Themen