3.3.0 • Published 10 months ago

@titicaca/ntk-koa-helpers v3.3.0

Weekly downloads
-
License
ISC
Repository
github
Last release
10 months ago

@titicaca/triple-koa-helpers

모듈별 문서는 다음을 참조해주십시오:

먼저 아래와 같이 서버, 그리고 에플리케이션을 구성해줍니다.

src/index.ts

import * as Sentry from '@sentry/node'
import { Context } from 'koa'
import {
  responseParserMiddleware,
  catchAppErrorsMiddleware,
} from '@titicaca/ntk-koa-helpers'

import { SENTRY_DSN, SENTRY_ENV } from './config'
import { createApp } from './app'
import { logger } from './logger'

const PORT = parseInt(process.env.PORT || '3000', 10)

if (SENTRY_DSN) {
  Sentry.init({ dsn: SENTRY_DSN, environment: SENTRY_ENV })
}

function main() {
  const koaApp = createApp()

  if (SENTRY_DSN) {
    koaApp.on(
      'error',
      (
        err,
        ctx: Context & {
          request: Sentry.PolymorphicRequest
        },
      ) => {
        Sentry.withScope((scope) => {
          scope.addEventProcessor((event) =>
            Sentry.addRequestDataToEvent(event, ctx.request),
          )

          Sentry.captureException(err)
        })
      },
    )
  }

  const server = koaApp.listen(PORT, () => {
    // eslint-disable-next-line no-console
    logger.info(`Koa server listening on ${PORT}.`)
  })

  server.keepAliveTimeout = 90 * 1000
}

// NOTE: 에러 센트리 훅 추가
catchUnhandledRejection(logger, (err) => {
  if (SENTRY_DSN) {
    Sentry.captureException(err)
  }
})

main()

src/app.ts

import Koa from 'koa'
import Router from 'koa-router'
import bodyParser from 'koa-bodyparser'
import {
  responseParserMiddleware,
  catchAppErrorsMiddleware,
} from '@titicaca/ntk-koa-helpers'
import tripleUserKoaMiddleware from '@titicaca/triple-user-auth-middleware'
import { httpLogger } from '@titicaca/ntk-logger'

import { logger } from './logger'
import * as poi from './poi'

const bodyParserMiddleware: Koa.Middleware = bodyParser({
  detectJSON: ({ request: { type } }) => /\bjson$/.test(type),
  enableTypes: ['json'],
  jsonLimit: '1mb', // 기본값이 1mb 입니다. 만약 더 큰 json body를 받아야 할 필요가 있다면 여기를 수정하세요.
})
export function createApp() {
  return new Koa()
    .use(
      catchAppErrorsMiddleware(logger, () => {
        console.log('CALLED AFTER HANDLING APP ERROR')
      }),
    ) //에러 핸들러 미들웨어 로거 주입 및 훅(필요하다면) 추가
    .use(bodyParserMiddleware)
    .use(tripleUserKoaMiddleware)
    .use()
    .use(httpLogger(logger))
    .use(responseParserMiddleware) // 꼭 미들웨어의 마지막 순서로 설치하셔야 합니다.
    .use(
      new Router()
        .get('/health', (context) => {
          context.status = 200
        })
        .routes(),
    )
    .use(routes())
}

function routes() {
  const router = new Router()
  router.use('/pois', poi.routes())

  return router.routes()
}

아래는 agenda 추가 예시입니다. (참조: 소스코드)

src/index.ts

async function main() {
  await initAgenda()
  const koaApp = createApp()
  ...
}
src/agenda.ts

import { Agenda } from 'agenda'

import { defineJobs } from 'path/to/controller'
import { db } from './mongodb-adapter'
import { logger } from './logger'
export const agendaClient = new Agenda({
  mongo: db,
  defaultLockLifetime: 1000 * 60 * 60 * 3,
  defaultConcurrency: 1,
  defaultLockLimit: 50,
})


export async function initAgenda() {
  defineJobs()
  agendaClient.on('fail', async (err: unknown, job: Job) => {
    const normalizedError = AppError.of({
      code: "ASYNCHRONOUS_ERROR",
      message: `Job id: ${job._id}가 실패했습니다.`
      context: {
        error,
        job,
      }
    })

    logger.error(normalizedError)
    //retry logic 등을 실행
    await handleJobFailure(job)
  })

  })
  try {
    await agendaClient.start()
  } catch (err) {
    console.error('어젠다 클라이언트를 시작하는데에 실패했습니다:', err)
  }
}

Usage

const tripleHttpErrors = require('@titicaca/triple-http-errors');

// TODO: DEMONSTRATE API
3.3.0

10 months ago

3.1.2

1 year ago

3.2.0

11 months ago

3.1.1

1 year ago

3.1.0

1 year ago

3.0.1-pr-11.6

1 year ago

3.0.1-pr-11.3

1 year ago

3.0.0

1 year ago