From c346ba8703db0cd8ab53ae3c20f5fe57e2446e77 Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Wed, 6 Mar 2024 11:47:17 +0800 Subject: [PATCH 1/3] do not throw error if failed to find tokens --- packages/api/src/services/user.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/api/src/services/user.ts b/packages/api/src/services/user.ts index 1a74500bb..fd62192a5 100644 --- a/packages/api/src/services/user.ts +++ b/packages/api/src/services/user.ts @@ -5,6 +5,7 @@ import { StatusType, User } from '../entity/user' import { authTrx, getRepository, queryBuilderToRawSql } from '../repository' import { userRepository } from '../repository/user' import { SetClaimsRole } from '../utils/dictionary' +import { logger } from '../utils/logger' import { PushNotificationType, sendMulticastPushNotifications, @@ -135,7 +136,8 @@ export const sendPushNotifications = async ( ) => { const tokens = await findDeviceTokensByUserId(userId) if (tokens.length === 0) { - throw new Error('No device tokens found') + logger.info(`No device tokens found for user ${userId}`) + return } const message = { From 289f1cf5e2ba8ccd1f3534c3cdb51f2429c33dec Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Wed, 6 Mar 2024 11:54:41 +0800 Subject: [PATCH 2/3] better error message --- packages/api/src/jobs/find_thumbnail.ts | 2 +- packages/api/src/jobs/trigger_rule.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/api/src/jobs/find_thumbnail.ts b/packages/api/src/jobs/find_thumbnail.ts index 85427dafc..cf6caa0ee 100644 --- a/packages/api/src/jobs/find_thumbnail.ts +++ b/packages/api/src/jobs/find_thumbnail.ts @@ -59,7 +59,7 @@ const getImageSize = async (src: string): Promise => { height, } } catch (e) { - logger.error(e) + logger.error('get image size error', e) return null } } diff --git a/packages/api/src/jobs/trigger_rule.ts b/packages/api/src/jobs/trigger_rule.ts index bc7b4a064..3e73d4661 100644 --- a/packages/api/src/jobs/trigger_rule.ts +++ b/packages/api/src/jobs/trigger_rule.ts @@ -130,7 +130,7 @@ const triggerActions = async ( try { await Promise.all(actionPromises) } catch (error) { - logger.error(error) + logger.error('Error triggering rule actions', error) } } From d41459a5cd15230405427ee546e6cde72334d0da Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Wed, 6 Mar 2024 12:04:16 +0800 Subject: [PATCH 3/3] log unhandled error --- packages/api/src/queue-processor.ts | 12 +++++++++++- packages/api/src/server.ts | 12 +++++++++++- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/packages/api/src/queue-processor.ts b/packages/api/src/queue-processor.ts index 6cd13b8a0..959c866fc 100644 --- a/packages/api/src/queue-processor.ts +++ b/packages/api/src/queue-processor.ts @@ -13,6 +13,7 @@ import { import express, { Express } from 'express' import { appDataSource } from './data_source' import { env } from './env' +import { aiSummarize, AI_SUMMARIZE_JOB_NAME } from './jobs/ai-summarize' import { bulkAction, BULK_ACTION_JOB_NAME } from './jobs/bulk_action' import { callWebhook, CALL_WEBHOOK_JOB_NAME } from './jobs/call_webhook' import { findThumbnail, THUMBNAIL_JOB } from './jobs/find_thumbnail' @@ -43,7 +44,6 @@ import { redisDataSource } from './redis_data_source' import { CACHED_READING_POSITION_PREFIX } from './services/cached_reading_position' import { getJobPriority } from './utils/createTask' import { logger } from './utils/logger' -import { AI_SUMMARIZE_JOB_NAME, aiSummarize } from './jobs/ai-summarize' export const QUEUE_NAME = 'omnivore-backend-queue' export const JOB_VERSION = 'v001' @@ -256,6 +256,16 @@ const main = async () => { process.on('SIGINT', () => gracefulShutdown('SIGINT')) process.on('SIGTERM', () => gracefulShutdown('SIGTERM')) + + process.on('uncaughtException', function (err) { + // Handle the error safely + logger.error('Uncaught exception', err) + }) + + process.on('unhandledRejection', (reason, promise) => { + // Handle the error safely + logger.error('Unhandled Rejection at: Promise', { promise, reason }) + }) } // only call main if the file was called from the CLI and wasn't required from another module diff --git a/packages/api/src/server.ts b/packages/api/src/server.ts index 135a9c4f9..995f7f289 100755 --- a/packages/api/src/server.ts +++ b/packages/api/src/server.ts @@ -47,7 +47,7 @@ import { isSystemRequest, } from './utils/auth' import { corsConfig } from './utils/corsConfig' -import { buildLogger, buildLoggerTransport } from './utils/logger' +import { buildLogger, buildLoggerTransport, logger } from './utils/logger' import { aiSummariesRouter } from './routers/ai_summary_router' const PORT = process.env.PORT || 4000 @@ -247,6 +247,16 @@ const main = async (): Promise => { process.on('SIGINT', () => gracefulShutdown('SIGINT')) process.on('SIGTERM', () => gracefulShutdown('SIGTERM')) + + process.on('uncaughtException', function (err) { + // Handle the error safely + logger.error('Uncaught exception', err) + }) + + process.on('unhandledRejection', (reason, promise) => { + // Handle the error safely + logger.error('Unhandled Rejection at: Promise', { promise, reason }) + }) } // only call main if the file was called from the CLI and wasn't required from another module