Javascript 如何编写一个cron作业来创建一次twilio消息

Javascript 如何编写一个cron作业来创建一次twilio消息,javascript,node.js,express,cron,twilio,Javascript,Node.js,Express,Cron,Twilio,我正试图让我的应用程序从firestore获取数据,并用这些数据创建消息。目前,我每分钟都有一个cron作业在运行,用于检查firestore并使用数据库中的数据创建消息。但是,问题是,由于它每分钟运行一次,因此会多次创建相同的消息。我试着不是每分钟都运行,只是在应用加载时创建消息,但问题是,如果用户在站点上创建了新消息,它将不会向应用注册,因为应用只从db获取一次。如何使用多条消息修复此问题 链接: require('dotenv').config() const path=require('

我正试图让我的应用程序从firestore获取数据,并用这些数据创建消息。目前,我每分钟都有一个cron作业在运行,用于检查firestore并使用数据库中的数据创建消息。但是,问题是,由于它每分钟运行一次,因此会多次创建相同的消息。我试着不是每分钟都运行,只是在应用加载时创建消息,但问题是,如果用户在站点上创建了新消息,它将不会向应用注册,因为应用只从db获取一次。如何使用多条消息修复此问题

链接:

require('dotenv').config()
const path=require('path');
常量twilio=require('twilio')
const client=twilio(
process.env.TWILIO\u帐户\u SID,
process.env.TWILIO_AUTH_KEY)
const cronJob=require('cron')。cronJob;
const express=require('express');
const bodyParser=require('body-parser');
const app=express()
use(bodyParser.json());
app.use(bodyParser.urlencoded({
扩展:正确
}));
const firebase=require(“firebase/app”);
要求(“消防基地/消防仓库”);
变量配置={
apiKey:process.env.FIREBASE\u API\u KEY,
authDomain:“提醒-app-4be61.firebaseapp.com”,
数据库URL:“https://reminder-app-4be61.firebaseio.com/",
projectId:“提醒-app-4be61”,
storageBucket:“提醒-app-4be61.appspot.com”,
messagingSenderId:“830815988398”,
appId:“1:830815988398:web:597257d987ea63668a9b3f”,
计量单位:“G-T600ZD0201”,
};
firebase.initializeApp(配置);
const db=firebase.firestore();
常数时间工厂=(小时,中午)=>{
如果(中午=='AM'和小时=='12'){
小时='00'
}
否则,如果(中午=='PM'和小时=='12'){
小时='12'
}
否则,如果(正午=='PM'&&Number(小时)<12){
小时数=小时数+12
}
否则,如果(中午=='AM'&&Number(小时)<12){
如果(小时[0]=“0”){
小时=0+数字(小时)
小时='0'+字符串(小时)
}否则{
小时=0+数字(小时)
}
}
返回字符串(小时)
}
const setReminderFrequency=(频率、日期、id)=>{
如果('Once'==freq){
let DayOfWeek=新日期(日期)
let day=DayOfWeek.getDay()
让DayOfMonth=date.slice(4,6)
让monthOfTheYear=date.slice(0,3)
db.collection(‘提醒’).doc(id).delete()
return[月日,月日,字符串('0'+天)]
}
else if('Daily'==freq){
返回['*','*','*']
}
else if('每周'==频率){
let DayOfWeek=新日期(日期)
let day=DayOfWeek.getDay()
返回['*','*',字符串('0'+天)]
}
否则如果('每月'==频率){
让DayOfMonth=date.slice(4,6)
返回[DayOfMonth,'*','*']
}
否则如果('year'==freq){
让monthOfTheYear=date.slice(0,3)
报税表['*',当年的月份'*']
}
}
新的cronJob('***',()=>{
const fetchData=async()=>{
常量数=[];
const data=await db.collection('提醒').get()
data.docs.map(doc=>numbers.push({…doc.data(),id:doc.id}))
对于(让我们记住数字){
让timeframe=提醒.time.slice(6,8);
让分钟=提醒。时间。切片(3,5);
let hour=提醒时间片(0,2);
小时=时间工厂(小时,时间范围);
让频率=设置提醒频率(
提醒频率,
提醒日期,
催款单
);
var textJob=new cronJob(
`${minute}${hour}${frequency[0]}${frequency[1]}${frequency[2]}`,
() => {
client.messages.create(
{
致:employment.phoneNumber,
发件人:“4104691056”//为什么“提醒我”id不起作用?
正文:提醒。留言,
},
(错误,消息)=>{
console.log(message.body,err)
}
);
},
无效的
正确,提示。时区
);
}
}
fetchData()
},null,true)
使用(express.static(path.join('build'));
应用程序获取('/*',(请求,请求)=>{
res.sendFile(path.join(uu dirname,'build','index.html');
});
var server=app.listen(process.env.PORT | | | 3001,()=>{
console.log('侦听端口%d',server.address().port);
});

您可能希望在处理记录时将其标记掉,这样您就不会重新创建同一条消息标记掉记录?很抱歉,这句话很混乱,我的意思是存储一个消息是为该特定记录发送的指示。这样,您就可以连续运行它,而无需重复消息
require('dotenv').config() 
const path = require('path');
const twilio = require('twilio')
const client = twilio(
  process.env.TWILIO_ACCOUNT_SID,
  process.env.TWILIO_AUTH_KEY)

const cronJob = require('cron').CronJob;

const express = require('express');
const bodyParser = require('body-parser');
const app = express()

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
  extended: true
}));
  
const firebase = require("firebase/app");
require("firebase/firestore");

var config = {
  apiKey: process.env.FIREBASE_API_KEY,
  authDomain: "reminder-app-4be61.firebaseapp.com",
  databaseURL: "https://reminder-app-4be61.firebaseio.com/",
  projectId: "reminder-app-4be61",
  storageBucket: "reminder-app-4be61.appspot.com",
  messagingSenderId: "830815988398",
  appId: "1:830815988398:web:597257d987ea63668a9b3f",
  measurementId: "G-T600ZD0201",
};
firebase.initializeApp(config);

const db = firebase.firestore();

const timeFactory = (hour, midday) =>{
  if(midday === 'AM' && hour === '12') {
    hour = '00'
  }
  else if(midday === 'PM' && hour === '12') {
    hour = '12'
  }
  else if(midday === 'PM' && Number(hour) < 12) {
    hour = Number(hour) + 12
  }
  else if(midday === 'AM' && Number(hour) < 12) {
    if(hour[0] === '0') {
      hour = 0 + Number(hour)
      hour = '0' + String(hour)
    } else {
      hour = 0 + Number(hour)
    }
  }
  return String(hour)
}
const setReminderFrequency = (freq, date, id) => {
  if('Once' === freq) {
    let dayOfTheWeek = new Date(date)
    let day = dayOfTheWeek.getDay()
    let dayOfTheMonth = date.slice(4, 6)
    let monthOfTheYear = date.slice(0, 3)
    db.collection('reminders').doc(id).delete()
    return [dayOfTheMonth, monthOfTheYear, String('0' + day)]
  }
  else if('Daily' === freq) {
    return ['*', '*', '*']
  }
  else if('Weekly' === freq) {
    let dayOfTheWeek = new Date(date)
    let day = dayOfTheWeek.getDay()
    return ['*', '*', String('0' + day)]
  }
  else if('Monthly' === freq) {
    let dayOfTheMonth = date.slice(4, 6)
   return [dayOfTheMonth, '*', '*']
  }
  else if('Yearly' === freq) {
    let monthOfTheYear = date.slice(0, 3)
    return ['*', monthOfTheYear, '*']
  }
}
new cronJob('* * * * *', () => {
  const fetchData = async () => {
    const numbers = [];
    const data = await db.collection('reminders').get()
    data.docs.map( doc => numbers.push({ ...doc.data(), id: doc.id }))
    for (let reminder of numbers) {
      let timeframe = reminder.time.slice(6, 8);
      let minute = reminder.time.slice(3, 5);
      let hour = reminder.time.slice(0, 2);
      hour = timeFactory(hour, timeframe);
      let frequency = setReminderFrequency(
        reminder.frequency,
        reminder.date,
        reminder.id
      );
      var textJob = new cronJob(
        `${minute} ${hour} ${frequency[0]} ${frequency[1]} ${frequency[2]}`,
        () => {
          client.messages.create(
            {
              to: reminder.phoneNumber,
              from: "4104691056",//Why "Reminder Me" id dont work?
              body: reminder.message,
            },
            (err, message) => {
              console.log(message.body, err)
            }
          );
        },
        null,
        true, reminder.timezone
      );
    }
    
  }
  fetchData()
}, null, true)

app.use(express.static(path.join(__dirname, 'build')));
app.get('/*', (req, res) => {
  res.sendFile(path.join(__dirname, 'build', 'index.html'));
});


  var server = app.listen(process.env.PORT || 3001, () => {
    console.log('Listening on port %d', server.address().port);
  });