2017-10-20 8 views
1

Azure関数を使用してHTMLファイルを開いて読み込み、返そうとしています。私はローカルに開発しています。ログには、関数がブラウザで正常に実行されたと表示されます。私は500の内部サーバーエラーを受けています。私はここで何か間違っているのですか?Azure関数からHTMLファイルを提供する際にエラーが発生しました

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

}; 

私は404.htmlが存在するとのindex.htmlが存在することを確信しています。 htmlContentの内容を記録すると、正しい出力が得られます。クロム

Response on Chrome with "Content-Length"

functions.json

​​

応答I "は、コンテンツ長が" 406

Response on Chrome without "Content-Length"

にステータスコードを変更するヘッダ削除した場合

Update 1コードはAzure Portal上で正常に動作しているように見えますが、ローカルで実行しているときは機能していません。あなたがHTTPからの戻りデータの2つの方法を組み合わせているように見えます

+0

はちょうどあなたのコードを試してみましたが、それは私のために正常に動作します。あなたはそれを紺碧に展開しようとしましたか? –

+0

Azure Portalで試してみましたが、正常に動作しています。しかし、それは何らかの理由でローカルに動作していません。 –

+0

"index.html"とは何ですか?ローカルエラーにはメッセージがありますか?(クロム "ネットワーク"ツールの[応答]タブ) –

答えて

0

は、関数(context.rescontext.done())トリガ:https://docs.microsoft.com/en-us/azure/azure-functions/functions-reference-node#accessing-the-request-and-response

をおcontext.resを使用しているので、あなたは間違って利用しているcontext.done();

+0

ありがとうございますが、context.done()を削除しています。関数を無期限に実行します。私もcontext.done(null、res)を使用して、 "$ return"への出力バインディングで "name"プロパティを設定しようとしましたが、私は私の質問で述べたのと同じ結果を得ます。 –

0

を削除してみてくださいcontext.resの場合、それを上書きするのではなく、Azure NodeJSワーカーに用意されているResponseクラスが提供するメソッドを利用するべきです。 VSCodeを使用している場合は、これらのメソッドにインテリセンスがあります。そうでない場合は、https://github.com/Azure/azure-functions-nodejs-worker/blob/dev/src/http/Response.ts

コードは次のようになります。 context.res.rawまたはcontext.res.sendを使用して

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

はすでにあなたのためcontext.done呼び出しを実行します。

content-type=text/htmlの代わりにcontent-type=text/html; charset-utf8を使用することを確認すると、返されたコンテンツタイプの問題が発生します。 content-type=text/htmlを返す代わりに、content-type=text/plainがあなたのhtmlをレンダリングできなくなります。

は上の対処:(ローカル/紺碧)https://github.com/Azure/azure-webjobs-sdk-script/issues/2053

関連する問題