Ваша первоначальная настройка не работает, потому что экспресс-приложение (созданное с помощью вызова express()
) никогда не запускается. Экспресс-приложение должно вызвать app.listen(portNum)
, чтобы запустить сервер и начать принимать входящие соединения. Это, однако, не так, как работают облачные функции. Не существует подхода «запусти сервер и жди запроса от клиента». Вместо этого в подходе облачных функций, когда запрос получен, файл / проект JS порождается, и запрос запускается изнутри. Идея вашего приложения, постоянно прослушивающего входящее соединение, просто не применима.
Теперь перейдем к подходу, который работает!
exports.app=functions.https.onRequest(app);
Если вы заметили, в исходном коде functions.https.onRequest
принимал функцию, которая вызывается с двумя параметрами request
и response
. Эти объекты в основном являются экземплярами классов http.IncomingMessage и http.serverResponse соответственно. NodeJS внутренне представляет все http-запросы, используя пару таких объектов. По совпадению, когда экспресс-приложение получает запрос http от клиента, оно также запускается с этими двумя объектами. На основе этих двух создается пара гораздо более богатых объектов Express Request и Response, которые распространяются по цепочке промежуточного программного обеспечения.
Теперь, когда вы передаете app
, Экспресс-приложение, в functions.https.onRequest
, система Firebase в основном будет рассматривать вашу app
как функцию, которая принимает объект http.IncomingMessage
и объект http.serverResponse
в качестве параметров. Это недокументированная особенность expressJS, которая вызывает приложение (хранится здесь в справочнике app
) как функцию, предоставляющую экземпляры IncomingMessage
и ServerResponse
в качестве 1-го и 2-го параметров соответственно, ведет себя так, как если бы запрос http был получен базовым сервером. Запрос и ответ выполняются через начальную обработку, а также цепочку промежуточного программного обеспечения точно так же, как любой запрос, полученный непосредственно сервером экспресс-доставки. Это может быть использовано в редких сценариях, когда пользователю необходимо сочетание нескольких платформ или иным образом нельзя явно запустить сервер, но он может получить доступ к объектам запроса и ответа другими способами. Как в этом сценарии.
Действительно, каждый раз, когда вы вызываете вашу облачную функцию, инфраструктура функций Firebase будет вызывать экспресс-приложение, хранящееся в справочнике app
, как функцию, а ваши промежуточные программы сделают все остальное.