Невозможно прочитать свойства неопределенного (чтение ‘findAll’)

Вопрос или проблема

const cron = require('node-cron')
const { Op } = require('sequelize')
const EmployeeDocumentsService = require('@/services/employee/EmployeeDocumentsService')
const EmailService = require('@/services/email/EmailService') // Ваш сервис электронной почты
const { MODEL_EMPLOYEEDOCUMENTS } = require('@/constants/modelName')

// Предполагая, что у вас есть способ получить подключение к базе данных
const conn = require('@/models') // Настройте это в соответствии со структурой вашего проекта

const notifyExpiredDocuments = async () => {
    const today = new Date()
    const expirationDate = new Date()
    expirationDate.setDate(today.getDate() + 15) // Установите на 15 дней с сегодняшнего дня

    const documents = await conn[MODEL_EMPLOYEEDOCUMENTS].findAll({
        where: {
            validUntil: {
                [Op.lte]: expirationDate,
                [Op.gt]: today,
            },
        },
        include: [
            {
                association: 'Employee', // Предполагая, что у вас есть модель сотрудника
                attributes: ['officialEmail', 'firstName'], // Включите электронную почту и имя сотрудника
            },
        ],
    })

    for (const document of documents) {
        const employeeEmail = document.Employee.officialEmail
        const employeeName = document.Employee.firstName
        const subject = `Напоминание о истечении срока действия документа: ${document.documentName}`
        const templateData = {
            name: employeeName,
            documentName: document.documentName,
            validUntil: document.validUntil.toDateString(),
        }

        try {
            await EmailService().sendMail(
                'DOC_EXPIRY',
                employeeEmail,
                employeeName,
                templateData
            )
        } catch (error) {
            console.error('Ошибка при отправке электронного письма:', error)
        }
    }
}
notifyExpiredDocuments().catch(console.error)
// Запланировать выполнение cron-задачи каждый день в 9 утра
cron.schedule('0 9 * * *', () => {
    console.log('Проверка на истекающие документы...')
    notifyExpiredDocuments().catch(console.error)
})

Мне нужно установить cron-задачу для триггера отправки электронной почты о истечении срока действия документа, но возникает следующая ошибка:

TypeError: Невозможно прочитать свойства неопределенного (чтение 'findAll')
    в notifyExpiredDocuments (C:\Users\Md-Azath\Desktop\hris\backend\src\jobs\cronjob.js:15:59)
    в Object.<anonymous> (C:\Users\Md-Azath\Desktop\hris\backend\src\jobs\cronjob.js:52:1)
    в Module._compile (node:internal/modules/cjs/loader:1376:14)
    в Module._extensions..js (node:internal/modules/cjs/loader:1435:10)
    в Module.load (node:internal/modules/cjs/loader:1207:32)
    в Module._load (node:internal/modules/cjs/loader:1023:12)
    в Module.require (node:internal/modules/cjs/loader:1235:19)
    в require (node:internal/modules/helpers:176:18)
    в Object.<anonymous> (C:\Users\Md-Azath\Desktop\hris\backend\src\app.js:19:1)

Мне нужна корректная функция

Ответ или решение

Ошибка, указанная вами, "Cannot read properties of undefined (reading ‘findAll’)", возникает из-за того, что объект, через который вы пытаетесь получить доступ к методу findAll, является неопределённым. В вашем случае это указывает на то, что conn[MODEL_EMPLOYEEDOCUMENTS] возвращает undefined.

Вот несколько шагов, которые необходимо предпринять для диагностики и устранения проблемы:

  1. Проверьте путь к модели: Убедитесь, что MODEL_EMPLOYEEDOCUMENTS определён правильно и указывает на модель документов сотрудников. Вы должны удостовериться, что эта модель корректно загружена в файл, где вы пытаетесь её использовать.

    // Проверьте, как вы определяете MODEL_EMPLOYEEDOCUMENTS
    const MODEL_EMPLOYEEDOCUMENTS = 'EmployeeDocuments'; // Замените на правильное название вашей модели
  2. Проверьте импорт модели: Убедитесь, что в файле, который вы загружаете с помощью require('@/models'), модели действительно доступны в объекте conn. Возможно, вам нужно проверить структуру и порядок экспорта/импорта ваших моделей.

    const conn = require('@/models'); // Убедитесь, что эта переменная содержит ваши модели
  3. Проверьте наличие модели: Добавьте некоторые отладочные сообщения, чтобы увидеть, что содержит conn и определена ли в нём ваша модель.

    console.log(conn); // Это выведет все доступные модели
    console.log(conn[MODEL_EMPLOYEEDOCUMENTS]); // Это покажет, определена ли конкретная модель
  4. Код исправления: Если вы хотите сделать код более защищённым в отношении неопределённых значений, вы можете добавить проверки:

    const notifyExpiredDocuments = async () => {
       const today = new Date();
       const expirationDate = new Date();
       expirationDate.setDate(today.getDate() + 15);
    
       const employeeDocumentsModel = conn[MODEL_EMPLOYEEDOCUMENTS];
    
       if (!employeeDocumentsModel) {
           console.error(`Model ${MODEL_EMPLOYEEDOCUMENTS} is not defined`);
           return; // Прекращаем выполнение, если модель не определена
       }
    
       try {
           const documents = await employeeDocumentsModel.findAll({
               where: {
                   validUntil: {
                   },
               },
               include: [
                   {
                       association: 'Employee',
                       attributes: ['officialEmail', 'firstName'],
                   },
               ],
           });
    
           for (const document of documents) {
               const employeeEmail = document.Employee.officialEmail;
               const employeeName = document.Employee.firstName;
               const subject = `Document Expiration Reminder for ${document.documentName}`;
               const templateData = {
                   name: employeeName,
                   documentName: document.documentName,
                   validUntil: document.validUntil.toDateString(),
               };
    
               try {
                   await EmailService().sendMail(
                       'DOC_EXPIRY',
                       employeeEmail,
                       employeeName,
                       templateData
                   );
               } catch (error) {
                   console.error('Error sending email:', error);
               }
           }
       } catch (error) {
           console.error('Error fetching documents:', error);
       }
    };
    
    // Вызов функции
    notifyExpiredDocuments().catch(console.error);

Эти шаги и улучшения должны помочь вам диагностировать и исправить указанную вами ошибку. Убедитесь, что ваша структура данных и модели корректны, и ошибки, связанные с определением объектов, больше не будут возникать.

Оцените материал
Добавить комментарий

Капча загружается...