5

Alexa 기술 내에서 일부 데이터를 쓰려고하는 Firebase 데이터베이스가 있습니다. 해당 스킬에 대한 Node.js 코드는 AWS Lambda 함수 내부에 있으며, 해당 코드가 실행되면 일부 데이터를 Firebase에 푸시하고자합니다.AWS 람다에서 호스팅되는 Alexa 기술 내에서 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) 제한 시간 제한이 이것의 원인 일 수 있다고 온라인에서 읽었으므로 제한 시간 제한을 1 분으로 늘렸고 여전히 예상대로 실행되지 않습니다. 또한 Node.js SDK 대신 Firebase REST API를 사용해 보았는데 그 중 하나가 작동하지 않았습니다. AWS Lambda에서 Firebase로 데이터를 푸시하는 올바른 방법은 무엇입니까?

+1

DB의 사용 권한이 인증되지 않은 읽기/쓰기를 허용합니까? –

+1

VPC 안에 람다 함수를 넣었습니까? –

+2

예, DB의 사용 권한은 공개입니다. 아마존 리소스에 액세스하려고하지 않기 때문에 VPC 역할을 구성해야한다고 생각하지 않았습니다. 어떤 종류의 VPC 역할을 구성해야합니까? – irams

답변

0

나는 이것도 실행했고 어떻게 작동하는지 알아 낸 유일한 방법은 핸들러에서 람다 콜백 함수를 지연시키는 것이다. 시도해보고 작동하는지 알려주세요.

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 (*****)을 호출하지 않아야합니다. 사용자에게 응답을 반환하자마자 스레드가 닫히고 정보가 저장되지 않습니다.

이 문제를 해결하는 가장 쉬운 방법은 정보가 저장되었다는 확인을 받으면 사용자에게 응답을 보내는 것입니다. 이 같은 중포 기지 뭔가의 경우

:

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"); 
    }); 

} 내가 이런 식으로 일을 시작할 때까지 나는 아무것도 저장되지 수

.

희망이 있습니다.

관련 문제