Как связывать и требовать не JS зависимостей в облачных функциях Firebase? - PullRequest
1 голос
/ 22 февраля 2020

У меня есть облачная функция http, которая возвращает динамику c HTML. Я хочу использовать руль в качестве движка шаблонов. Шаблон достаточно большой, поэтому нецелесообразно иметь его в переменной const поверх моей функции.

Я пробовал что-то вроде:

const template = fs.readFileSync('./template.hbs', 'utf-8');

Но при развертывании Функция Я всегда получаю сообщение об ошибке, что файл не существует:

Error: ENOENT: no such file or directory, open './template.hbs'

template.hbs находится в том же каталоге, что и мой index.js файл, поэтому я предполагаю, что проблема заключается в том, что Firebase CLI не связывает этот файл вместе с остальными файлами.

Согласно документам Google Cloud Functions можно связывать локальные модули с "mymodule": "file:mymodule". Поэтому я попытался создать папку templates в root проекта и добавил "templates": "file:./templates" в package.json.

Моя структура файла выглядит примерно так:

/my-function
  index.js
/templates
  something.hbs
index.js //this is the entry point

А потом:

const template = fs.readFileSync('../node_modules/templates/something.hbs', 'utf-8');

Но я получаю ту же самую не найденную ошибку.

Как правильно включить и требовать не JS зависимостей в Firebase Облачная функция?

Ответы [ 2 ]

2 голосов
/ 22 февраля 2020

Интерфейс командной строки Firebase упакует все файлы в вашей папке функций, , за исключением узловых модулей , и отправит весь архив в Cloud Functions. Он восстановит node_modules, выполнив npm install во время создания образа docker, который выполняет вашу функцию.

Если ваш файлthing.hbs находится в каталоге / templates в папке ваших функций, вы можете использовать его как ./templates/something.hbs из индекса верхнего уровня. js. Если ваш JS находится в другой папке, вам, возможно, придется сначала найти выход с ../templates/something.hbs. Все файлы должны быть там - просто определите путь. Я бы не стал делать что-то необычное с твоей посылкой. json. Просто воспользуйтесь тем, что CLI развертывает все, кроме node_modules.

Этот код отлично работает для меня, если у меня есть файл с именем 'foo' в root моей папки функций:

import * as fs from 'fs'
export const test = functions.https.onRequest((req, res) => {
    const foo = fs.readFileSync('./foo', 'utf-8')
    console.log(foo)
    res.send(foo)
})
1 голос
/ 22 февраля 2020

Решением было использование path.join(__dirname,'template.hbs').

const fs = require('fs');
const path = require('path');
const template = fs.readFileSync(path.join(__dirname,'template.hbs'), 'utf-8');

Как указал @ doug-stevenson, все файлы включены в окончательный комплект, но по какой-то причине использование относительного пути не сработало. Форсирование абсолютного пути с помощью __dirname сделало свое дело.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...