我正在尝试使用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的回复
如果我删除了“Content-Length”标题,状态代码将更改为406。
更新1 代码似乎在Azure门户上正常运行,但在本地运行时无效。
答案 0 :(得分:0)
看起来你正在组合两种从http触发函数(context.res
和context.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.raw
或context.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