2016-10-20 6 views
0

firebase 데이터베이스의 변경 사항을 수신 한 다음 일부 이메일 주소로 전자 메일을 보내는 서버를 만들려고합니다. firebase와 sendgrid를 구현할 수 있습니다. 이미 데이터베이스에 항목을 추가하고 테스트 메일을 보내서 테스트했습니다. 그래서 sendgrid와 firebase가 작동합니다. 여기에서 문제는 전자 메일을 보내는 방식으로 전자 메일을 보내는 응용 프로그램을 열 때마다 전자 메일을 보내는 방식에 달려 있습니다.heroku 서버 및 파이어베이스

그래서 여기에 문제가 발생합니다. 앱이 열릴 때마다 js 파일의 코드가 실행됩니다. 데이터베이스에 자식 추가 이벤트를 수신하는 코드를 추가하면 앱을 열 때마다 호출되므로 다중 수신기가 활성화되어 하나의 이벤트에 대해 여러 개의 이메일이 전송된다고 가정합니다.

나는 우둔 해요, 어쨌든 이것이 한 번만 부름 받았습니까? 또는 "app"을 두 번 이상 열지 않아야합니까? 아니면 서버를 올바르게 배치하지 않습니까?

내 목표는 heroku에서 "앱"을 실제로 열 필요없이 서버를 배포 한 후 자동으로 서버를 배포하거나 적어도 앱이 열려있을 때 코드가 다시 호출되지 않도록하는 것입니다 배포 할 때 한 번만 여기

이는 package.json

{ 
    "name": "server_test", 
    "version": "1.0.0", 
    "description": "", 
    "main": "server.js", 
    "scripts": { 
    "start": "node server.js" 
    }, 
    "engines": { 
    "node": "6.9.0" 
    }, 
    "author": "", 
    "license": "ISC", 
    "dependencies": { 
    "firebase": "^3.5.1", 
    "sendgrid": "^4.7.0" 
    } 
} 

과 procfile에게 있습니다

var firebase = require('firebase'); 
var helper = require('sendgrid').mail; 

firebase.initializeApp({ 
    serviceAccount: "./DB-A2312SDA.json", 
    databaseURL: "https://DATABASENAME.firebaseio.com/" 
}); 

// Email 

var from_email = new helper.Email('[email protected]'); 
var to_email = new helper.Email('[email protected]'); 
var subject = 'Hello World from the SendGrid Node.js Library!'; 
var content = new helper.Content('text/plain', 'Hello, Email!'); 
var mail = new helper.Mail(from_email, subject, to_email, content); 

var sg = require('sendgrid')(process.env.SG_API_KEY); 
var request = sg.emptyRequest({ 
    method: 'POST', 
    path: '/v3/mail/send', 
    body: mail.toJSON(), 
}); 

sg.API(request, function(error, response) { 
    console.log(response.statusCode); 
    console.log(response.body); 
    console.log(response.headers); 
}); 

server.js 코드입니다

이러한 시나리오에서 일반적으로
web: node server.js 

답변

1

당신 ' 메시지를 보내야하는 주소를 나타내는 노드가 데이터베이스에 있습니다. 당신이 뭔가에 가입 한 사람들에게 환영 메시지를 보내려면 예를 들어, 해당 모델 수 :

welcomeMessageQueue 
    $pushid 
     email: "[email protected]" 
     firstName: "Ralcom" 

당신이 당신의 노드 스크립트에서 리스너를 첨부 할 수 있습니다하지 않는 것이 :

  1. 각 메시지
  2. 는 해당 이메일 주소를
  3. 에게 메시지를 전송하고 큐에서 항목을 제거

여기서 중요한 점은 메시지를 보낸 후에 대기열에서 항목을 제거한다는 것입니다. 그렇게하면 메시지는 한 번만 전송됩니다.

이 될 것이라고 할 수있는 간단한 방법이 할 수있는 확장 성이 방법을

var ref = firebase.database().ref(); 
var queue = ref.child('welcomeMessageQueue'); 
queue.on('child_added', function(snapshot) { 
    var message = snapshot.val(); 
    var sg = require('sendgrid')(process.env.SG_API_KEY); 
    var request = sg.emptyRequest({ 
     method: 'POST', 
     path: '/v3/mail/send', 
     body: mail.toJSON(), 
    }); 

    sg.API(request) 
     .then(function(response) { 
      snapshot.ref.remove(); 
     }); 
}) 

firebase-queue를 보라.

이 방법을 사용하는 간단한 자습서는 blog post on sending push notifications을 참조하십시오.

+0

그래서 실제 서버 코드가 호출 될 횟수를 제어 할 수는 없지만 데이터베이스 데이터 자체를 대신 제어 할 수 있습니까? - 다시 말하면, 다중 리스너를 활성화하는 것은 중요하지 않습니까? – Rialcom

+0

프랭크 나는 당신의 코드를 시도했지만 예상대로 작동하지 않습니다. 앱은 특정 시간이지나거나 앱이 영웅으로 열렸을 때만 메일을 보냅니다.데이터가 데이터베이스에 추가되면 서버가 마치 한 번 누군가가 영웅 앱에 액세스하면 활성화 된 것처럼 보입니다. – Rialcom

+0

그럴 수 있습니다. 나는 코드의 라이프 사이클을 관리 할 수있는 Heroku에서 이러한 백 엔드를 실행 한 경험이 없습니다. 덜 관리되는 환경 (예 : Digital Ocean, Google Compute Engine 또는 App Engine Flexible Environment의 node.js)에서는 이러한 프로세스가 정상적으로 실행됩니다. –