gpt4 book ai didi

node.js - heroku 服务器和 firebase

转载 作者:太空宇宙 更新时间:2023-11-04 00:33:15 26 4
gpt4 key购买 nike

我正在尝试创建一个服务器来监听 Firebase 数据库中所做的更改,然后将电子邮件发送到某个电子邮件地址。我设法实现 firebase 和 sendgrid,我已经通过向数据库添加一些条目并发送测试邮件进行了测试。所以 sendgrid 和 firebase 正在工作。这里的问题取决于我如何发送电子邮件,每次我打开应用程序时它都会发送电子邮件。

那么问题来了,如果应用程序每次打开时都会执行js文件中的代码。当我添加代码来监听数据库中添加的子事件时,每次打开应用程序时都会调用该代码,因此多个监听器将处于事件状态,并且我假设将针对一个事件发送多封电子邮件。

所以我一无所知,无论如何,这只会被调用一次吗?或者我不应该多次打开“应用程序”?或者我没有以正确的方式部署服务器?

我的目标是,一旦我部署服务器,它将自动执行其编写的操作,而无需在heroku中实际打开“应用程序”,或者至少当应用程序打开时,代码不会再次被调用,部署时只需一次。

这是 server.js 的代码

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('example@example.com');
var to_email = new helper.Email('example@gmail.com');
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);
});

这是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

web: node server.js

最佳答案

通常在这种情况下,您的数据库中会有一个 Node ,指示您需要将消息发送到的地址。例如,如果您想向已注册某项内容的人发送欢迎消息,您可以将其建模为:

welcomeMessageQueue
$pushid
email: "rialcom@company.com"
firstName: "Ralcom"

您不能在 Node 脚本中附加一个监听器:

  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 .

关于node.js - heroku 服务器和 firebase,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40149165/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com