Динамический экспорт функций в firebase - PullRequest
0 голосов
/ 24 октября 2018

У меня типичная (по многим сообщениям) проблема с холодной загрузкой в ​​облачных функциях.Решение, которое казалось обещанным, предлагает импортировать / экспортировать только фактически выполняемую функцию, как можно увидеть здесь:

https://github.com/firebase/functions-samples/issues/170#issuecomment-323375462

if (!process.env.FUNCTION_NAME || process.env.FUNCTION_NAME === 'sendFollowerNotification') {
  exports.sendFollowerNotification = require('./sendFollowerNotification');
}

Это пример Javascript, но я 'используя машинопись.Я пробовал несколько вариантов, и, хотя некоторые сборки, в конце концов, я всегда застрял с моей функцией не экспортируемой и развертывания, предупреждая меня, что я собираюсь удалить существующую функцию.

ЭтоЭто одна из многочисленных попыток:

if (!process.env.FUNCTION_NAME || process.env.FUNCTION_NAME === 'generateInviteURL') {
  import ('./invite_functions').then ((mod) => { console.log ("mod follows" ); console.log (mod);  exports.generateInviteURL = functions.https.onRequest( mod.generateInviteURL ); } )
  .catch ((err) => {console.log ("Trying to import/export generateInviteURL ", err);}) ;
}

Как уже упоминалось, во время развертывания я получаю предупреждение об удалении функции.

Мне удалось «избежать» этогосообщение с чем-то вроде этого:

console.log ("Function name: ", process.env.FUNCTION_NAME);

function dummy_generateInviteURL (req, res) { ; }
exports.generateInviteURL = functions.https.onRequest( dummy_generateInviteURL );

if (!process.env.FUNCTION_NAME || process.env.FUNCTION_NAME === 'generateInviteURL') {
console.log ("Doing the good import");
import ('./invite_functions').then ((mod) => { console.log ("mod follows" ); console.log (mod);  exports.generateInviteURL = functions.https.onRequest( mod.generateInviteURL ); } )
  .catch ((err) => {console.log ("Trying to import/export generateInviteURL ", err);}) ;
}

console.log ("Exported");
console.log (exports.generateInviteURL);

Какая идея, конечно, что пустая функция всегда будет экспортироваться, но будет заменена реальной, если она вызывается.

В этом случае журналы выглядят так:

generateInviteURL Function name:  generateInviteURL generateInviteURL  
generateInviteURL Exported generateInviteURL
{ [Function: cloudFunction] __trigger: { httpsTrigger: {} } }

Итак, первая часть выглядит многообещающе (переменная среды определена), затем импорт что-то делает (входит в блок then, а не в catch), но экспортируетсяпеременная не заменяется.

Я не уверен, является ли это проблемой TypeScript, проблемой Firebase или разработчиком - возможно, я просто упускаю что-то очевидное.

Итак, вопрос - как мне избежатьимпортировать / экспортировать что-либо, что мне не нужно для каждой конкретной функции?

1 Ответ

0 голосов
/ 21 декабря 2018

Вы можете придерживаться исходного index.js, с небольшими изменениями.Я пробовал несколько раз и пришел с решением.Включаю образец структуры dir и два машинописных файла (index.ts и другой для вашей пользовательской функции).При этом вам никогда не придется изменять index.ts для изменения или добавления функций.

Структура каталогов

+ functions
|
 -- + src
|   |
|    -- index.ts
|   |
|    -- + get
|       |
|        -- status.f.ts
 -- package.json (auto generated)
|
 -- package-lock.json (auto generated)
|
 -- tsconfig.json (auto generated)
|
 -- tslint.json (auto generated)
|
 -- + lib (auto generated)
|
 -- + node_modules (auto generated)

src / index.ts

import * as glob from "glob";
import * as camelCase from "camelcase";
const files = glob.sync('./**/*.f.js', { cwd: __dirname, ignore: './node_modules/**'});
for(let f=0,fl=files.length; f<fl; f++){
  const file = files[f];
  const functionName = camelCase(file.slice(0, -5).split('/').join('_')); // Strip off '.f.js'
  if (!process.env.FUNCTION_NAME || process.env.FUNCTION_NAME === functionName) {
    exports[functionName] = require(file);
  }
}

src/get/status.f.ts

import * as functions from 'firebase-functions';

exports = module.exports = functions.https.onRequest((req, res) => {
    res.status(200).json({'status':'OK'})
})

После того, как вы создали вышеупомянутый файл, установите пакеты npm 'glob' и 'camelcase', затем попробуйте развернуть функции firebase

Firebase будетразверните функцию с именем 'getStatus'

ПРИМЕЧАНИЕ , что имя функции является вербальной версией имен папок и имени файла, в котором существует функция, поэтому вы можете экспортировать только одна функция на файл .f.ts

EDIT

Я обновил структуру dir.Обратите внимание, что index.ts и все последующие файлы и папки находятся в родительской папке 'src'

...