время ожидания функции истекает, когда запускается 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. перетащить каплю в определенное место
  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();
  });


};

function.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"
}

person Alex Gordon    schedule 15.12.2019    source источник
comment
Ваш второй код содержит недопустимую ссылку на response (вне области видимости), и вы слишком рано звоните done. Должен быть помещен во внутренний обратный вызов (который выполняется позже). Возможно, это неправильное представление вашего кода?   -  person trincot    schedule 15.12.2019
comment
Благодарность! Я попытался использовать код из приведенного ниже ответа, однако у меня все еще возникают таймауты   -  person Alex Gordon    schedule 15.12.2019


Ответы (1)


Если вы проверите свои журналы node.js в Azure, вы увидите ошибку типа 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();
    });
  });
};
person hurricane    schedule 15.12.2019