从Azure功能提供HTML文件时出错

时间:2017-10-20 21:14:59

标签: javascript node.js azure azure-functions

我正在尝试使用Azure功能打开,阅读和返回HTML文件。我在本地开发,日志说该功能执行成功然而在浏览器上我得到500内部服务器错误。我在这里做错了吗?

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的内容时,它会给出正确的输出。

functions.json

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

对Chrome的回复

Response on Chrome with "Content-Length"

如果我删除了“Content-Length”标题,状态代码将更改为406。

Response on Chrome without "Content-Length"

更新1 代码似乎在Azure门户上正常运行,但在本地运行时无效。

2 个答案:

答案 0 :(得分:0)

看起来你正在组合两种从http触发函数(context.rescontext.done())返回数据的方法:https://docs.microsoft.com/en-us/azure/azure-functions/functions-reference-node#accessing-the-request-and-response

由于您使用的是context.res,请尝试删除context.done();

答案 1 :(得分:0)

您正在错误地使用context.res,您不应该覆盖它,而是利用Azure NodeJS工作程序中提供的Response类提供的方法。如果您正在使用VSCode,那么您将获得这些方法的智能感知。否则请参阅:https://github.com/Azure/azure-functions-nodejs-worker/blob/dev/src/http/Response.ts

您的代码应该看起来像这样。

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

使用context.res.rawcontext.res.send已经为您执行context.done来电。

请确保使用content-type=text/html; charset-utf8代替content-type=text/html,否则您将触发返回内容类型的问题。而不是返回content-type=text/html,最终得到的content-type=text/plain将无法呈现您的HTML。

解决:https://github.com/Azure/azure-webjobs-sdk-script/issues/2053