У меня есть скрипт 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.
Что мне не хватает?
Пожалуйста, отредактируйте вопрос, чтобы показать фактический код и сообщения об ошибках. Нам нужно увидеть полный минимальный код, который воспроизводит проблему. В вопросе должно быть достаточно информации, которую любой может использовать для воспроизведения проблемы.
Имейте в виду также, что вам почти наверняка потребуется внести изменения в код, чтобы обеспечить правильное завершение функции . Не стоит слепо копировать все на место — к Cloud Functions предъявляются особые требования.
«Подробная трассировка стека: ошибка: не удается найти модуль« axios »» // Предоставленный модуль не может быть загружен. // Не удалось загрузить функцию, завершение работы. // Функция не может быть инициализирована.
Вы использовали npm для установки модулей, которые используете для этого проекта?
@DougStevenson Думаю, это была моя ошибка. Спасибо!





Когда вы развертываете облачную функцию, необходимо заполнить каталог node_modules или использовать Webpack (или что-то подобное) для включения зависимостей. Firebase Deploy, похоже, по существу заархивирует весь каталог, загрузит и затем запустит его в облаке, чтобы развернуть конкретную функцию, как указано в точке входа. Все зависимости должны присутствовать в той или иной форме.
Я использую несколько нетрадиционный подход к этому, но суть в том, что облачные функции НЕ ЯВЛЯЮТСЯ просто еще одним хостом для развертывания — у них есть довольно специфические форматы и функции, которым вы должны следовать. Прочтите документацию. Прочтите еще раз. Пройдитесь по образцам. Затем помните, что образцы — это самый простой, но не единственный подход.
Интерфейс командной строки Firebase вообще не будет развертывать node_modules. Фактически, он развертывает все, кроме этого. Облачные функции восстановят его, прежде чем создать образ докера для этой функции. Очень важно, чтобы package.json и package-lock.json были обновлены.
Вы могли бы так подумать, но если папки node_modules нет, она не будет развернута. Откуда мне знать? Я только что попробовал. Он может не загружать папку node_modules, но я сразу же получил «модуль не найден», когда запустил firebase deploy после удаления папки node_modules. может быть потому, что я использую несколько необычную структуру папок/развертываний.
Я не говорю, что он не должен присутствовать на локальном компьютере во время развертывания. Я просто говорю, что это не развертывается. Поэтому, когда вы сказали, что «Firebase Deploy, по сути, заархивирует весь каталог», это не совсем так.
Какие фактические сообщения об ошибках вы видите? Вы говорите, что получаете ошибки, но не описываете, что это за ошибки.