Тайм-аут процесса | Амазонка лямбда в Firebase

Я написал код в node.js, и мои данные на Firebase. Проблема, с которой я сталкиваюсь, заключается в том, что мой код никогда не завершается. Я сделал это такСсылка на сайт

Проблема в том, что ссылка / слушатель firebase никогда не обнуляется, и поэтому моя функция никогда не завершается. Я пытался с помощьюfirebase.database().goOffline() но это не сработало.

На моей локальной машине я принудительно остановил процесс, используяprocess.exit(0), но когда я развернул свой код на AWS lambda, он не возвращает никакого ответа / обратного вызова и завершает работу (выдает сообщение об ошибке "Процесс завершен до завершения запроса«)

Я также добавил ожидание 5-10 секунд после вызова обратного вызова в lambda, а затем принудительно завершил процесс, но это тоже не помогло.

Как исправить эту проблему? Пожалуйста помоги.

Ответы на вопрос(4)

callbackWaitsForEmptyEventLoop вfalse должно быть вашим последним средством, если для вас больше ничего не работает, так как это может привести к худшим ошибкам, чем проблема, которую вы пытаетесь решить здесь.

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

// handlerWithFirebase.js

const admin = require("firebase-admin");
const config = require("./config.json");

function initialize() {
  return admin.initializeApp({
    credential: admin.credential.cert(config),
    databaseURL: "https://<your_app>.firebaseio.com",
  });
}

function handlerWithFirebase(func) {
  return (event, context, callback) => {
    const firebase = initialize();
    let _callback = (error, result) => {
      firebase.delete();
      callback(error, result);
    }
    // passing firebase into your handler here is optional
    func(event, context, _callback, firebase /*optional*/);
  }
}

module.exports = handlerWithFirebase;

А потом в моем коде лямбда-обработчика

// myHandler.js

const handlerWithFirebase = require("../firebase/handler");

module.exports.handler = handlerWithFirebase(
(event, context, callback, firebase) => {
    ...
});

lambda пользователь ушел.

Как и предполагалось, вы можете использоватьcontext.done для остановки.тем не мение, это не рекомендуется, так как это возможно только из-за исторических версий времени выполнения nodejs.

почему это время ожидания происходит?

Ваша лямбда может дойти до последней строки вашего кода и продолжать работать. Ну, на самом деле он чего-то ждет - цикл событий будет пустым.

что это значит?

В nodejs, когда вы выполняете асинхронную операцию и регистрируете функцию обратного вызова, которая должна быть выполнена после выполнения операции, в цикле событий происходит своего рода регистрация.

В одной строке это цикл обработки событий, который знает, какую функцию обратного вызова выполнить после завершения асинхронной операции. Но это в другой теме :)

обратно в лямбду

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

Что если вам все еще нужно остановить выполнение вручную? независимо от состояния цикла событий? В начале функции выполните:

context.callbackWaitsForEmptyEventLoop = false

А затем используйте третий параметр, который вы получите в сигнатуре обработчика. Какойcallback.

параметр обратного вызова

Это функция, которую вы вызываете, когда хотите завершить выполнение.

Если вы вызываете его без параметров или с первым параметром как нулевым, а текст - вторым параметром - это считается успешным вызовом.

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

callbackи затемprocess.exit(0) не помогло в моем случае.goOffline() методfirebase тоже не помогло.

Я исправил проблему с вызовомcontext.done(error, response) (вместо метода обратного вызова). Теперь мой код работает.

Тем не менее, если у кого-то есть лучшее решение, пожалуйста, напишите здесь. Это может помочь кому-то еще :)

 Fayza Nawaz29 авг. 2016 г., 07:51
о ... спасибо, sanjeev, я проверю свой код, а также использую nodejs4.3. Я новичок в Node.js, не могли бы вы сказать мне, какой компилятор или инструмент вы используете? @sanjeev
 sanjeev27 авг. 2016 г., 17:16
goOffline () и callback () у меня тоже не работают. Я мог видеть ответ в выводе журнала, но результатом был тайм-аут. Он начал работать с использованием context.done (err, rest). Я не уверен насчет поддержки aws, она дает мне понять, что context.done () устарел в nodejs4.3

и тогда вы сможете использовать обратный вызов без проблем:

function handler (event, context, callback) {
  context.callbackWaitsForEmptyEventLoop = false // Add this line
}

Ваш ответ на вопрос