Функции Azure - чтение файла с диска и возврат HTML-страницы - PullRequest
0 голосов
/ 09 января 2019

Я тестирую функции узла Azure локально на моем компьютере с Linux.

Когда это срабатывает:

module.exports = async function (context, req) {
    readFile = require('../SharedCode/readFile.js');
    filepath = __dirname + '/../bootstrap-HTML-page/static/simple.html'
    fs = require('fs');

    fs.readFile(filepath,function(error,content){
      if(error) {
        content = error;
      }
      if(content) {
        context.res = {
          status: 200,
          headers: {
                'Content-Type': 'text/html'
              },
          body: content
        }
      }
    })
};

Тогда я получаю пустой ответ.

Однако, если я выполню это, то получу ожидаемый ответ:

context.res = {
      status: 200,
      headers: {
            'Content-Type': 'text/html'
          },
      body: '<html> <body> <h1> test </h1> </body> </html>'
    }

Я проверил переменную content и вижу там свою HTML-страницу. Я не могу понять, почему он не отвечает со страницей.

РЕДАКТИРОВАТЬ: Я думаю, это потому, что встроенный API fs не может обрабатывать обещания, и вам нужно использовать что-то вроде Promisify, чтобы заставить его работать как асинхронная функция

Ответы [ 2 ]

0 голосов
/ 09 января 2019

Я думаю, что этот ответ объясняет, почему он не работает

и

Это как заставить его работать как обычная (не асинхронная) функция

это мой исправленный код, который теперь работает:

var fs = require('fs');


module.exports = function (context, req) {
    var filepath = __dirname + '/../bootstrap-HTML-page/static/simple.html'
    fs.readFile(filepath, 'utf8', function (err, content) {
        if (err) {
            context.log.error(err);
            context.done(err);
        }
        //context.log(result.name);
        context.res = {
        status: 200,
        headers: {
              'Content-Type': 'text/html'
            },
        body: content
      };
        context.done();
    });
}
0 голосов
/ 09 января 2019

Проблема с вашим кодом заключается в том, что, даже если вы добавили async в объявление функции, вы забыли дождаться завершения асинхронной операции fs.readFile с помощью ключевого слова await. Так как он не существует, выполнение вашего кода продолжается обычным способом, который достигает конца метода и, следовательно, возвращает пустой ответ.

module.exports = async function (context, req) {
    readFile = require('../SharedCode/readFile.js');
    filepath = __dirname + '/../bootstrap-HTML-page/static/simple.html'
    fs = require('fs');

    await fs.readFile(filepath,function(error,content){
      if(error) {
        content = error;
      }
      if(content) {
        context.res = {
          status: 200,
          headers: {
                'Content-Type': 'text/html'
              },
          body: content
        }
      }
    })
};
...