javascript - http触发时函数超时
问题描述
我究竟做错了什么?为什么函数超时?
我有一个 blob 触发的功能,它工作得很好:
const Jimp = require("jimp");
module.exports = function(context, myBlob) {
const correlation = context.bindings.inputBlob.correlation;
const inputImage = context.bindings.inputBlob.image;
const imageName = context.bindings.inputBlob.imageName;
context.log(
correlation + "Attempting to convert this image to a tiff: " + imageName
);
Jimp.read(Buffer.from(inputImage, "base64"), function(err, image) {
image.getBuffer(Jimp.MIME_TIFF, function(error, tiff) {
const response = {
myimage: tiff.toString("base64"),
correlation: correlation
};
context.bindings.outputBlob = response
context.log(
correlation + "Successfully converted " + imageName + " to tiff."
);
context.done();
});
});
};
这是function.json文件:
{
"bindings": [
{
"name": "myBlob",
"type": "blobTrigger",
"direction": "in",
"path": "images-in/{destination}/{name}",
"connection": "AZURE_STORAGE_CONNECTION_STRING"
},
{
"name": "inputBlob",
"type": "blob",
"direction": "in",
"path": "images-in/{destination}/{name}",
"connection": "AZURE_STORAGE_CONNECTION_STRING"
},
{
"type": "blob",
"name": "outputBlob",
"path": "{destination}/{name}.tiff",
"connection": "AZURE_STORAGE_CONNECTION_STRING",
"direction": "out"
}
],
"disabled": false
}
它的工作方式:
- 将 blob 拖放到特定位置
- 输出 blob 将由函数在另一个位置生成(整个过程不超过 5 秒)。
我决定我需要这个函数是 http 触发的,所以我做了以下更改:
const Jimp = require("jimp");
module.exports = function(context, req) {
Jimp.read(Buffer.from(req.body, "base64"), function(err, image) {
image.getBuffer(Jimp.MIME_TIFF, function(error, tiff) {
const response = {
myimage: tiff.toString("base64"),
correlation: "yeeeeees"
};
});
context.res = {
body: response
};
context.done();
});
};
函数.json:
{
"bindings": [
{
"authLevel": "anonymous",
"type": "httpTrigger",
"direction": "in",
"name": "req",
"methods": [
"post"
]
},
{
"type": "http",
"direction": "out",
"name": "res"
}
]
}
但是,我得到了500:
遥测显示如下:
我究竟做错了什么?为什么函数超时?
我对该函数进行了以下更新:
const Jimp = require("jimp");
module.exports = function (context, req) {
const text = Buffer.from(req.body, "base64").toString("utf-8");
Jimp.read(text, function(err, image) {
if (err) {
context.res = {
body: err
};
context.done();
}
image.getBuffer(Jimp.MIME_TIFF, function(error, tiff) {
if (error) {
context.res = {
body: error
};
context.done();
}
const response = {
myimage: tiff.toString("base64"),
correlation: "yeeeeees"
};
context.res = {
body: response
};
context.done();
});
});
};
这产生了以下荒谬的回应:
{
"errno": -4058,
"code": "ENOENT",
"syscall": "open",
"path": "D:\\home\\site\\wwwroot\\$R\u0005������{\u001av��r��Ū�O�$z�ނ)",
"methodName": "constructor"
}
解决方案
如果您在 Azure 中检查 node.js 日志,您会看到一个错误,response is not defined
因为您定义响应的范围与您使用的范围不同。
所以基本上你不能调用 context.done(); 函数,这就是您的请求引发超时异常的原因。
使用 async/await 将帮助您避免此类问题。请检查此代码示例以了解可能出现的问题。
const Jimp = require("jimp");
module.exports = function(context, req) {
Jimp.read(Buffer.from(req.body, "base64"), function(err, image) {
if(err){
context.res = {
body: err
};
context.done();
}
image.getBuffer(Jimp.MIME_TIFF, function(error, tiff) {
if(error){
context.res = {
body: error
};
context.done();
}
const response = {
myimage: tiff.toString("base64"),
correlation: "yeeeeees"
};
context.res = {
body: response
};
context.done();
});
});
};
推荐阅读
- python - 为什么 Python 安装程序不会自动将自身添加到 Windows 上的 PATH 变量中?
- node.js - 续集expressjs中的事务未执行
- ios - 在基于 UIDocumentBrowserViewController 的应用程序中打开多个文档
- shell - 在 sh 脚本中捕获正则表达式组
- python - 将类属性设置为属性
- ios - 在 awakeFromNib 上调用 UIView animate withDuration 不会执行动画
- r - 使用 stargazer 在 Rmarkdown beamer 中绘制表格
- python - 如何输入 JSON 文件
- tensorflow - Tensorflow Object Detection API Faster-RCNN 收敛但检测不准确
- ios - UIPage 控件的画外音或可访问性