Process timeout | Amazon Lambda to Firebase

前端 未结 4 667
粉色の甜心
粉色の甜心 2021-01-19 11:46

i\'ve written code in node.js and my data is on Firebase. The problem i\'m facing is that my code never exits. I\'ve done it like this one Link

The problem is that f

相关标签:
4条回答
  • 2021-01-19 12:14

    Calling callbackfunciton and then process.exit(0) didn't help in my case. goOffline() method of firebase didn't help either.

    I fixed the issue calling context.done(error, response) (instead of callback method). Now, my code is working.

    Still, if any one have better solution, kindly post here. It may help some one else :)

    0 讨论(0)
  • 2021-01-19 12:15

    Your going through crisis that any new lambda user has gone.

    As suggested, you can use context.done for stopping. However, this is not recommended as this is only possible due to historic runtime versions of nodejs.


    why this timeout happens?

    Your lambda may get to the last line of your code and still keep running. Well, it is actually waiting for something - for the event loop to be empty.

    what this means?

    In nodejs, when you make an async operation and register a callback function to be executed once the operation is done, the registration sort of happens in the event loop.

    In one line, it's the event loop that knows which callback function to execute when an async operation ends. But that's to another thread :)


    back to Lambda

    Given the above information, it follows that lambda should not halt before empty event loop is reached - as this means some follow-up procedure will not execute after some async operation returns.

    What if you still need to halt the execution manually? regardless of the event loop status? At the beginning of the function, execute:

    context.callbackWaitsForEmptyEventLoop = false
    

    And then use the third parameter you get in the handler signature. Which is the callback.

    the callback parameter

    It is a function which you call when you want to end the execution.

    If you call it with no parameters, or with the first parameter as null and text as second parameter - it is considered as a successful invocation.

    To fail the lambda execution, you can call the callback function with some non-null value as the first parameter.

    0 讨论(0)
  • 2021-01-19 12:15

    Setting callbackWaitsForEmptyEventLoop to false should only be your last resort if nothing else works for you, as this might introduce worse bugs than the problem you're trying to solve here.

    This is what I do instead to ensure every call has firebase initialized, and deleted before exiting.

    // 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;
    

    And then in my lambda handler code

    // myHandler.js
    
    const handlerWithFirebase = require("../firebase/handler");
    
    module.exports.handler = handlerWithFirebase(
    (event, context, callback, firebase) => {
        ...
    });
    
    0 讨论(0)
  • 2021-01-19 12:27

    Add this line at the beginning of your handler function and then you should be able to use the callback without issue:

    function handler (event, context, callback) {
      context.callbackWaitsForEmptyEventLoop = false // Add this line
    }
    
    0 讨论(0)
提交回复
热议问题