首页 > 解决方案 > 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
}

它的工作方式:

  1. 将 blob 拖放到特定位置
  2. 输出 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"
}

标签: javascriptnode.jsazure-functionsjimp

解决方案


如果您在 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();
    });
  });
};

推荐阅读