BlitzJs와 CRON을 사용하여 매주 통신을 자동화하는 방법

나는 최근에 번개전을 발견했다.js와 love 프레임워크는 응용 프로그램을 얼마나 빨리 구축할 수 있는지 알려 주지만, 내가 가장 좋아하는 부분은 명령행 도구입니다.전격전.js에는 node REPL 환경을 통해 미리 정의된 조회와 변화를 실행할 수 있는 컨트롤러가 있습니다. 이 환경은 명령줄에서 수동으로 작업을 실행하기에 매우 적합하지만, CRON job 내부에서 실행할 때 좋지 않습니다. 프로세스를 인수하여 실행하기 때문입니다.
나는 뉴스 이야기를 수집하는 시사 통신이 있는데, 나는 일주일에 한 번씩 자동으로 보내고 싶다.bash 스크립트를 통해 시작하는 CRON 솔루션이 필요합니다. 이 스크립트는expect 명령을 사용하지 않기 때문에child 프로세스 모듈을 연구하기 시작했습니다.
Medium에 등록하여 이 자습서를 읽어 주십시오. Medium signup link

오래된 데이터 삭제
전격전.js는 Next 위에 세워진 것입니다.그래서 위탁 관리는 유연하지만 나에게 승자는 과장이다.일반 도메인 이름 형식.나는 그들에게 가입하지 않았지만, 내가 시도한 위탁 관리 플랫폼 중에서 그들이 가장 싸고 구축하기 쉽다.이 글은 렌더를 어떻게 사용해서 위탁 관리를 하는지 깊이 있게 소개하지 않을 것이다. 단지 이것이 내가 CRON 작업을 설치한 호스트라는 것을 알아야 한다.
Render는 간단한 CRON 서비스를 제공합니다.나는 내 아이가 매주 두 가지 일을 하기를 바란다.
  • 내 데이터베이스에서 6일 이상 기록 삭제
  • 일주일이 정상적이지 않으면 시사통신 automail을 실행하십시오
  • 내 bash 스크립트는 입구점이 될 것이며, 이 과정을 시작할 것입니다.
    echo 'Running weekly script...'
    echo 'Clearing old data...'
    chmod +x ./automation/clearMail.ts
    ts-node ./automation/clearMail.ts
    echo 'Old data cleared from db'
    echo 'Checking if auto mailer should send...'
    WEEK=`date +"%V"`
    if [ $(($WEEK%2)) -eq 0 ];
    then
        echo "Sending auto mailer..."
        chmod +x ./automation/sendAutoMail.ts
        ts-node ./automation/sendAutoMail.ts
    else
        echo "No auto mail to send"
    fi
    echo 'Done'
    
    나는 여기에서 ts 노드를 사용하여 다른 Typescript 파일을 호출하는데, 이 파일들은 내가 완성하고자 하는 핵심 논리를 실행할 것이다.첫 번째 거 보여줘.
    // clearMail.ts
    import { onExit, streamEnd } from '@rauschma/stringio'
    import { spawn } from 'child_process'
    import { writeToWritable } from '../app/core/utils'
    
    async function clearMail() {
        const blitzProcess = spawn('blitz console', [], { shell: true, stdio: ['pipe', process.stdout, process.stderr] })
        blitzProcess.on('error', (err) => {
            console.error(err.message)
        })
    
        await writeToWritable({
            commands: ['await clearOld()', '.exit'],
            writable: blitzProcess.stdin
        })
    
        return await onExit(blitzProcess)
    }
    
    clearMail()
    
    이 파일은 사용자 정의 stdio 설정이 있는blitz 컨트롤러를 사용하여 새 프로세스를 생성합니다.이 설정은 매우 중요하고, 나의 해결 방안에 대한 유일한 효과적인 설정이기도 하다.blitz 컨트롤러가 시작되면 메인 프로세스를 막고 더 많은 명령을 실행하지 못하게 하는 문제가 있었습니다.부모 프로세스와 하위 프로세스 입력을 통신하고 있습니다.부모는 아이에게 무엇을 해야 하는지 알려줄 수 있지만, 반대로도 마찬가지다.출력 채널과 오류 채널에 대해서는 주 프로세스 stout과sterr를 각각 기본으로 사용합니다.
    나는 또한 blitz 프로세스가 오류 이벤트 처리 프로그램의 프로세스를 통해 모든 오류를 기록한다고 말했다.나는 메일 데이터베이스에서 오래된 기록을 삭제하는clearOld 변종을 실행하기 위해 실용적인 방법을 사용하고 있다.콘솔의 실행 흐름을 관리하기 위해Axel Rauschmayer에서 제공하는stringio 패키지도 사용합니다.
    // writeToWritable.ts
    import { streamEnd, streamWrite } from '@rauschma/stringio'
    import { Writable } from 'stream'
    
    export default async function writeToWritable({ commands, writable }: { writable: Writable; commands: string[] }) {
        for (const cmd of commands) {
            await streamWrite(writable, `${cmd}\n`)
        }
    
        return await streamEnd(writable)
    }
    
    이 파일은 새 하위 프로세스에 여러 명령을 쓰고 흐름을 끝냅니다.완성되면, 우리는blitz 컨트롤 데스크톱의 프로세스를 종료할 것이다.만약 네가 흥미가 있다면, 나의 clearOld 돌연변이가 이렇게 보일 것이다.
    // clearOld.ts
    import db from 'db'
    import { sub } from 'date-fns'
    
    export default async function clearOld() {
        try {
            return await db.mail.deleteMany({
                where: {
                    createdAt: {
                        lt: sub(new Date(), { days: 6 })
                    }
                }
            })
        } catch (err) {
            throw new Error(err.message)
        }
    }
    

    송신
    bash 스크립트의 다음 부분은 일주일에 한 번씩 자동 메일 프로그램 파일을 실행합니다.이 파일은Firebase에서 제 등록을 받아서 Sendgrid API를 통해 뉴스 스토리를 보냅니다.여기의 하위 프로세스 설정은 동일합니다. 유일한 차이점은 파일이 실행될 때 이 인자들을 전달할 수 있기를 바랍니다. 저는 해적 테마의 명령행 인자인 Yargs를 사용합니다.
    Yargs on Github
    나도 HTML이 있는 임시 파일을 만들어서 시사 통신을 보낼 때 불러오는 실용적인 방법이 있다.이 HTML은 내가 다른 표에 저장한 시사 통신의 템플릿이 될 것이다.한 마디로 하면 이 모든 것이 본 강좌의 범위를 넘어섰기 때문에 여기는 auto-mailer 파일의 기본 코드입니다.
    // sendAutoMail.ts
    import { makeTemp, writeToWritable } from '../app/core/utils'
    import { autoMailer } from '../designs/designs.json'
    import { hideBin } from 'yargs/helpers'
    import { onExit } from '@rauschma/stringio'
    import { spawn } from 'child_process'
    import yargs from 'yargs/yargs'
    
    async function sendAutoMail() {
        try {
            const argv = yargs(hideBin(process.argv)).argv
            const isTest = (argv.test as boolean) ?? false
            const testUsers = isTest ? JSON.stringify([{ email: '[email protected]' }]) : undefined
            const subject = isTest ? 'test' : 'Your weekly echo stories'
            const html = autoMailer
            const htmlName = await makeTemp({ data: html, name: 'auto_mailer' })
            const blitzProcess = spawn('blitz console', [], { shell: true, stdio: ['pipe', process.stdout, process.stderr] })
    
            blitzProcess.on('error', (err) => {
                throw new Error(err.message)
            })
    
            blitzProcess.stdin.on('error', (err) => {
                throw new Error(err.message)
            })
    
            if (testUsers !== undefined) {
                await writeToWritable({
                    commands: [
                        `await sendMail({ html: '${htmlName}', raw: false, mail: true, subject: '${subject}', testUsers: ${testUsers}  })`,
                        '.exit'
                    ],
                    writable: blitzProcess.stdin
                })
            } else {
                await writeToWritable({
                    commands: [`await sendMail({ html: '${htmlName}', raw: false, mail: true, subject: '${subject}'  })`, '.exit'],
                    writable: blitzProcess.stdin
                })
            }
    
            return await onExit(blitzProcess)
        } catch (err) {
            throw new Error(err.message)
        }
    }
    
    sendAutoMail()
    

    결론
    나는 이것이 도움이 될 수 있기를 바란다.전격전.js는 훌륭합니다. 이를 사용하여 개발하는 것은 매우 재미있지만, CLI는 파일과 폴더를 생성하는 것 외에도 사용할 수 있습니다. 이것은 재미있는 CRON 작업 해결 방안을 열 수 있습니다.나는 이 컨트롤러가 간단하고 재미있지만 bash를 통해 명령을 자동으로 실행하려고 시도할 때 매우 부족하다는 것을 발견했다.나의 해결 방안은 나의 용례에 매우 적합하다. 만약 내가 나의 뉴스 원고에 이러한 특정한 목표를 설정하지 않았다면, 나는 기존의 전자 우편 뉴스 원고 해결 방안을 사용할 것이다.
    이 안내서는 CRON이 blitz 콘솔을 사용하는 데 단계별 해결 방안을 제공하지는 않지만, 이러한 기술을 사용하여 작업 절차를 자동화하는 것을 계발할 것입니다.만약 저와 같이 다른 Saas 공급자가 제공하는 해결 방안 이외의 해결 방안이 필요하다면, CRON과 일부 도구를 사용하여 자동화 작업 흐름을 만들 수 있습니다.당신은 나의 해결 방안이 어떻다고 생각합니까?개선할 여지가 있습니까? 아니면 제가 과도하게 설계했습니까?궁금하면 내가 이 크론 숙제를 만든 시사통신도 볼 수 있어.
    Echo Breaking News

    좋은 웹페이지 즐겨찾기