• 로그인
  • 장바구니에 상품이 없습니다.

home2 게시판 JavaScript, TS 게시판 주기적으로 fcm 보내기

주기적으로 fcm 보내기

2 글 보임 - 1 에서 2 까지 (총 2 중에서)
  • 글쓴이
  • #128072

    배승원
    참가자
    지금 특정 시간마다 firestroe에 저장된 fcm 토큰값을 불러와서 자동으로 메시지를 전송하는 기능을 만들려고 합니다.
    근데 firebase-admin하고 firebase-function을 사용해야 하는 것 같은데
    const functions = require('firebase-functions');
    이 구간에서 ReferenceError: require is not defined이 자꾸 뜹니다.
    찾아보니 브라우저 환경에서는 안된다고 es6로 바꿔 import로 사용하라 하는데 정보가 적어서 정확히 어떻게 하라는지를 모르겠어서..
    firebase 기반 웹이고 index.html은 다음과 같습니다.
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-T3c6CoIi6uLrA9TneNEoa7RxnatzjcDSCmG1MXxSR1GAsXEV/Dwwykc2MPK8M2HN" crossorigin="anonymous">
      <title>Document</title>
      <link href="main.css"  rel="stylesheet">
      <meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">
    </head>
    <body>
      <script src="https://www.gstatic.com/firebasejs/8.6.5/firebase-app.js"></script>
      <script src="https://www.gstatic.com/firebasejs/8.6.5/firebase-firestore.js"></script>
      <script src="https://www.gstatic.com/firebasejs/8.6.5/firebase-storage.js"></script>
      <script src="https://www.gstatic.com/firebasejs/8.6.5/firebase-messaging.js"></script>
      
      <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz" crossorigin="anonymous"></script>
        <link rel="stylesheet" href="http://code.jquery.com/ui/1.13.2/themes/base/jquery-ui.css">
        <script src="https://code.jquery.com/jquery-latest.js"></script>
        <script src="https://code.jquery.com/ui/1.13.2/jquery-ui.js"></script>
        
      <script>
      var firebaseConfig = {
        firebase sdk값
      };
      </script>
      
      <input type="text" class="datepicker notranslate">
      <div class="menusheet" id="breakfast"></div>
      <div class="menusheet" id="lunch"></div>
      <div class="menusheet" id="dinner"></div>
      <button type="submit" class="btn btn-primary" id="breakfast">아침</button>
      <button type="submit" class="btn btn-primary" id="lunch">점심</button>
      <button type="submit" class="btn btn-primary" id="dinner">저녁</button>
      <script>
        //import cron from 'node-cron';
      firebase.initializeApp(firebaseConfig);
      tokenvalue = ""
      tag = "DDISH_NM"
      if(navigator.serviceWorker){
            navigator.serviceWorker.register('/firebase-messaging-sw.js')
                .then(function(reg){console.log('서비스워커 등록성공 :', reg)})
                .catch(function(error){console.log('서비스워커 등록실패 :', error)});
        }
      const messaging = firebase.messaging();
      const db = firebase.firestore();
      messaging
      .requestPermission()
      .then(function () {
        // 토큰 받기
        return messaging.getToken();
      })
      .then(function (token) {
        console.log(token)
        tokenvalue = token
        // 이 토큰을 서버에 저장하고 필요할 때마다 사용하여 푸시 알림을 보낼 수 있습니다.
      })
      .catch(function (err) {
        console.log("Unable to get permission to notify.", err);
      });
    // 알림 받기
    messaging.onMessage(function (payload) {
      console.log('포그라운드 메시지 수신: ', payload);
          const notificationTitle = payload.notification.title;
          const notificationOptions = {
            body: payload.notification.body,
            icon: payload.notification.icon,
          }
          new Notification(notificationTitle, notificationOptions);
    });
    /* 오류 발생
      const functions = require('firebase-functions');
      const admin = require('firebase-admin');
      admin.initializeApp();
      exports.everyDayTask = functions
      .region("asia-northeast3")
      .pubsub.schedule("every day 00:00")
      .timeZone("Asia/Seoul")
      .onRun(async (context) => {
        // 여기에 매일 실행할 코드를 작성합니다.
        console.log('매일 자정에 실행되는 작업입니다.');
        return null;
      });*/
      $('button[id*=breakfast]').click(function(){
            tokenstr = tokenvalue.toString();
            console.log(tokenstr)
            db.collection('breakfast').doc(tokenstr).update({key : tokenstr}).then((res)=>{
            })
          })
          $('button[id*=lunch]').click(function(){
            tokenstr = tokenvalue.toString();
            console.log(tokenstr)
            db.collection('lunch').doc(tokenstr).update({key : tokenstr}).then((res)=>{
            })
          })
          $('button[id*=dinner]').click(function(){
            tokenstr = tokenvalue.toString();
            console.log(tokenstr)
            db.collection('dinner').doc(tokenstr).update({key : tokenstr}).then((res)=>{
            })
          })
      function LoadKey(){
        db.collection("breakfast").doc().get().then((결과치)=>{
            결과.forEach((doc)=>{
              keyvalue = doc.key
              
            })
          })
      }
      function Dayserch(date){
        url = "https://open.neis.go.kr/hub/mealServiceDietInfo?ATPT_OFCDC_SC_CODE=Q10&SD_SCHUL_CODE=8490107&KEY=06c2634b191d41d78a091f2df381bf25&MLSV_YMD="+date
        console.log(url)
        FindXml(url)
      }/*
      function sayHello() {
      console.log("Hello, world!");
      }
      cron.schedule("* * * * *", function() {
      sayHello();
      });*/
      function FindXml(url){
        fetch(url)
      .then(response => response.text())
      .then(xmlString => {
        var parser = new DOMParser();
        var xmlDoc = parser.parseFromString(xmlString, "text/xml");
        var tagName = tag; // 가져올 태그명 설정
        var elements = xmlDoc.getElementsByTagName(tagName);
        if (elements.length > 0) {
          $('pre').remove('#va');
          var values = [];
          for (var i = 0; i < elements.length; i++) {
            var listarray = [];
            var value = elements[i].textContent;
            value = value.replace(/<br\/>/g,"\n")
            nvalue = value.split('\n')
            for (var w in nvalue){
              if(nvalue[w].length>18){
                navalue = nvalue[w].split(' ')
                console.log(navalue)
                for (var e in navalue){
                  listarray.push(navalue[e])
                }
              }
              else{
                console.log(nvalue)
                listarray.push(nvalue[w])
              }
            }
            values.push(listarray);
            console.log(values[i]);
          }
          for (var i in values[0]){
            var 템플릿 = `<pre id="va">${values[0][i]}</pre>`
            $('#breakfast').append(템플릿)
          }
          for (var i in values[1]){
            var 템플릿 = `<pre id="va">${values[1][i]}</pre>`
            $('#lunch').append(템플릿)
          }
          for (var i in values[2]){
            var 템플릿 = `<pre id="va">${values[2][i]}</pre>`
            $('#dinner').append(템플릿)
          }
        } else {
          console.log("Tag <" + tagName + "> not found.");
        }
      })
      .catch(error => {
        console.log("Error fetching XML:", error);
      });
      }
      
      $(function(){
            $('.datepicker').datepicker({
                onSelect: function() {
                    var date = $(".datepicker").val()
                    console.log(date)
                    var ndate = date.split('-')
                    datelist=[]
                    for(var num in ndate){
                        datelist[num] = ndate[num]
                    }
                    seldate = ndate[0]+ndate[1]+ndate[2]
                    selndate = (seldate).toString();
                    Dayserch(selndate)
                }
                ,dateFormat: 'yy-mm-dd' //달력 날짜 형태
               ,showOtherMonths: true //빈 공간에 현재월의 앞뒤월의 날짜를 표시
               ,showMonthAfterYear:true // 월- 년 순서가아닌 년도 - 월 순서
               ,changeYear: true //option값 년 선택 가능
               ,changeMonth: true //option값  월 선택 가능                
               ,showOn: "both" //button:버튼을 표시하고,버튼을 눌러야만 달력 표시 ^ both:버튼을 표시하고,버튼을 누르거나 input을 클릭하면 달력 표시  
               ,buttonImage: "http://jqueryui.com/resources/demos/datepicker/images/calendar.gif" //버튼 이미지 경로
               ,buttonImageOnly: true //버튼 이미지만 깔끔하게 보이게함
               ,buttonText: "선택" //버튼 호버 텍스트              
               ,yearSuffix: "년" //달력의 년도 부분 뒤 텍스트
               ,monthNamesShort: ['1월','2월','3월','4월','5월','6월','7월','8월','9월','10월','11월','12월'] //달력의 월 부분 텍스트
               ,monthNames: ['1월','2월','3월','4월','5월','6월','7월','8월','9월','10월','11월','12월'] //달력의 월 부분 Tooltip
               ,dayNamesMin: ['일','월','화','수','목','금','토'] //달력의 요일 텍스트
               ,dayNames: ['일요일','월요일','화요일','수요일','목요일','금요일','토요일'] //달력의 요일 Tooltip
               ,minDate: "-5Y" //최소 선택일자(-1D:하루전, -1M:한달전, -1Y:일년전)
               ,maxDate: "+5y" //최대 선택일자(+1D:하루후, -1M:한달후, -1Y:일년후)
            });
          })
    </script>
    </body>
    </html>
     
    #128097

    codingapple
    키 마스터
    functions 기능은 서버코드라서 html파일에 작성하진 않습니다 
    공식 가이드대로 js파일하나 만들어서 거기다가 코드짭시다
2 글 보임 - 1 에서 2 까지 (총 2 중에서)
  • 답변은 로그인 후 가능합니다.

About

현재 월 700명 신규수강중입니다.

  (09:00~20:00) 빠른 상담은 카톡 플러스친구 코딩애플 (링크)
  admin@codingapple.com
  이용약관
ⓒ Codingapple, 강의 예제, 영상 복제 금지
top

© Codingapple, All rights reserved. 슈퍼로켓 에듀케이션 / 서울특별시 강동구 고덕로 19길 30 / 사업자등록번호 : 212-26-14752 온라인 교육학원업 / 통신판매업신고번호 : 제 2017-서울강동-0002 호 / 개인정보관리자 : 박종흠