Превращение скрипта Node.js в функцию Firebase

У меня есть скрипт node.js, который отлично работает при запуске из командной строки, но когда я пытаюсь использовать его как функцию, происходит сбой.

const functions = require('firebase-functions');
exports.dailyUpdate = functions.pubsub.schedule('5 5 * * *')
.onRun((context) => {
db.collection("meters")
  .get()
  .then(function (querySnapshot) {
    querySnapshot.forEach(function (doc) {
      let mtrList = meterlist.push([
        doc.id,
      ]);
      return true;
    });

    meterlist
      .forEach(function (obj) {
        var meterid = obj[0];
        var meterdata;
        var history = [];

        axios
          .get(url)
          .then((response) => {
            metername = meterid.toString();
            meterdata = response.data.meterdata;
            if (meterdata) {
              meterdata.forEach(function (obj) {
                let datadate = obj.stamp.substring(0, 10);
                let datatime = obj.stamp.substring(11, 13);
                let data = obj.data;
                history.push({
                  metername: metername,
                  datadate: datadate,
                  datatime: datatime,
                  data: data,
                });
              });

let todayUpdate = runCalculations(history);

               updateDB(todayUpdate);
            }
            return Promise.resolve("done!");
          })
          .catch(function (error) {
            console.info(error);
          });
        return true;
      })
    return true;
  })
  .catch(function (error) {
    console.info(error);
  });

  response.send("Updated!!");
});

Я уверен, что делаю что-то не так, но когда я, например, ставлю require в разделе кода,

const axios = require("axios");
const firebase = require("firebase");
require("firebase/firestore");
var moment = require("moment");
var _ = require("lodash");
var Promise = require("promise");

не запускается, потому что не знает, где находится axios. Когда я помещаю их перед exports... под const functions = require('firebase-functions');, я получаю разные ошибки, в том числе: ""Подробная трассировка стека: Ошибка: не удается найти модуль 'axios'" // Предоставленный модуль не может быть загружен. // Не удалось загрузить функцию, завершение работы. // Функция не может быть инициализирована. "

Сам скрипт запускает querySnapshot из базы данных Firestore, анализирует результаты, вызывает API через axios, выполняет ряд вычислений, а затем обновляет базу данных обновленными результатами. И я хочу, чтобы это запускалось в 5:05 утра каждый день.

Я не вносил никаких изменений в фактический код скрипта, кроме включения приведенного выше кода exports.

Что мне не хватает?

Какие фактические сообщения об ошибках вы видите? Вы говорите, что получаете ошибки, но не описываете, что это за ошибки.

Kolban 11.12.2020 16:44

Пожалуйста, отредактируйте вопрос, чтобы показать фактический код и сообщения об ошибках. Нам нужно увидеть полный минимальный код, который воспроизводит проблему. В вопросе должно быть достаточно информации, которую любой может использовать для воспроизведения проблемы.

Doug Stevenson 11.12.2020 16:48

Имейте в виду также, что вам почти наверняка потребуется внести изменения в код, чтобы обеспечить правильное завершение функции . Не стоит слепо копировать все на место — к Cloud Functions предъявляются особые требования.

Doug Stevenson 11.12.2020 16:50

«Подробная трассировка стека: ошибка: не удается найти модуль« axios »» // Предоставленный модуль не может быть загружен. // Не удалось загрузить функцию, завершение работы. // Функция не может быть инициализирована.

Ezra Butler 11.12.2020 17:19

Вы использовали npm для установки модулей, которые используете для этого проекта?

Doug Stevenson 12.12.2020 18:05

@DougStevenson Думаю, это была моя ошибка. Спасибо!

Ezra Butler 15.12.2020 23:29
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
107
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Когда вы развертываете облачную функцию, необходимо заполнить каталог node_modules или использовать Webpack (или что-то подобное) для включения зависимостей. Firebase Deploy, похоже, по существу заархивирует весь каталог, загрузит и затем запустит его в облаке, чтобы развернуть конкретную функцию, как указано в точке входа. Все зависимости должны присутствовать в той или иной форме.

Я использую несколько нетрадиционный подход к этому, но суть в том, что облачные функции НЕ ЯВЛЯЮТСЯ просто еще одним хостом для развертывания — у них есть довольно специфические форматы и функции, которым вы должны следовать. Прочтите документацию. Прочтите еще раз. Пройдитесь по образцам. Затем помните, что образцы — это самый простой, но не единственный подход.

Интерфейс командной строки Firebase вообще не будет развертывать node_modules. Фактически, он развертывает все, кроме этого. Облачные функции восстановят его, прежде чем создать образ докера для этой функции. Очень важно, чтобы package.json и package-lock.json были обновлены.

Doug Stevenson 15.12.2020 23:42

Вы могли бы так подумать, но если папки node_modules нет, она не будет развернута. Откуда мне знать? Я только что попробовал. Он может не загружать папку node_modules, но я сразу же получил «модуль не найден», когда запустил firebase deploy после удаления папки node_modules. может быть потому, что я использую несколько необычную структуру папок/развертываний.

LeadDreamer 16.12.2020 21:13

Я не говорю, что он не должен присутствовать на локальном компьютере во время развертывания. Я просто говорю, что это не развертывается. Поэтому, когда вы сказали, что «Firebase Deploy, по сути, заархивирует весь каталог», это не совсем так.

Doug Stevenson 16.12.2020 21:26

Другие вопросы по теме