【问题标题】:Can't push data to Firebase from within an Alexa Skill hosted on AWS Lambda无法从 AWS Lambda 上托管的 Alexa Skill 中将数据推送到 Firebase
【发布时间】:2017-03-03 03:28:47
【问题描述】:

我在 Firebase 中有一个数据库,我正在尝试从我的 Alexa Skill 中写入一些数据。该技能的 Node.js 代码位于 AWS Lambda 函数中,当该代码运行时,我想将一些数据推送到 Firebase。

我已经测试了在 Lambda 之外连接并推送到 Firebase 的代码,它的工作方式完全符合预期。以下是该代码:

var firebase = require('firebase');

firebase.initializeApp({
    databaseURL: 'https://myapp.firebaseio.com',
    serviceAccount: './myapp.json',
});

var cart = firebase.database().ref('/cart'); 
console.log(cart);
    cart.push( {
    item: 'apples', quantity: '1', amount: '0'
},  function(error) {
    if (error) {
         console.log("Data could not be saved." + error);
    } else {
         console.log("Data saved successfully.");
    }
});

当从 Lambda 函数中执行时,相同的代码不会向数据库实例推送任何内容。我在网上读到 Lambda 超时限制可能是造成这种情况的一个原因,所以我将超时限制增加到一分钟,但它仍然没有按预期运行。我也尝试过使用 Firebase REST API 而不是他们的 Node.js SDK,但这也不起作用。从 AWS Lambda 内将数据推送到 Firebase 的正确方法是什么?

【问题讨论】:

  • 您的数据库的权限是否允许未经身份验证的读/写?
  • 您是否将 Lambda 函数放置在 VPC 中?
  • 是的,数据库的权限是公开的。而且我认为我不必配置 VPC 角色,因为我没有尝试访问 Amazon 资源。我需要配置什么样的 VPC 角色?
  • 有什么更新吗?我也在尝试这样做。

标签: amazon-web-services firebase firebase-realtime-database aws-lambda alexa-skills-kit


【解决方案1】:

我也遇到过这种情况,我想出如何让它工作的唯一方法是延迟处理程序中的 lambda 回调函数。试试这个,让我知道它是否有效。

var firebase = require('firebase');

firebase.initializeApp({
    databaseURL: 'https://myapp.firebaseio.com',
    serviceAccount: './myapp.json',
});

exports.handler = (event, context, callback) => {
    var cart = firebase.database().ref('/cart'); 
    console.log(cart);
        cart.push( {
        item: 'apples', quantity: '1', amount: '0'
        setTimeout(()=>{
            callback(null, 'success');
        },2000);
    },  function(error) {
        if (error) {
             console.log("Data could not be saved." + error);
             setTimeout(()=>{
                 callback(error);
             },2000);
        } else {
             console.log("Data saved successfully.");
             setTimeout(()=>{
                 callback(null, 'success');
             },2000);
        }
    });
}

【讨论】:

    【解决方案2】:

    我想我知道为什么会发生这种情况,我遇到了类似的问题,这就是我所做的。

    如果您想在数据库中写入一些日期,您需要确保在完成之前不要调用 this.emit(*****)。一旦您将响应返回给用户,线程就会关闭并且您的信息不会被保存。

    解决此问题的最简单方法是在确认信息已保存后将响应返回给用户。

    如果是这样的 Firebase:

    function writeUserData(userId) {
    
    // Get a key for a new Post.
    var userKey = db.ref('users/').push().key;
    
    var reference = db.ref('users/' + userKey).set({
        user: userId
    });
    
    reference.then(() => {
            alexa.emit(':ask', "Works");
        },
        (err) => {
            alexa.emit(':ask', "Does not work");
        });
    

    }

    在我开始这样做之前,我无法保存任何东西。

    希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 2019-11-09
      • 2018-01-21
      • 1970-01-01
      • 2016-09-22
      • 2016-11-13
      • 1970-01-01
      • 1970-01-01
      • 2016-10-31
      • 2016-04-24
      相关资源
      最近更新 更多