Вопрос или проблема
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
.
Вот несколько шагов, которые необходимо предпринять для диагностики и устранения проблемы:
-
Проверьте путь к модели: Убедитесь, что
MODEL_EMPLOYEEDOCUMENTS
определён правильно и указывает на модель документов сотрудников. Вы должны удостовериться, что эта модель корректно загружена в файл, где вы пытаетесь её использовать.// Проверьте, как вы определяете MODEL_EMPLOYEEDOCUMENTS const MODEL_EMPLOYEEDOCUMENTS = 'EmployeeDocuments'; // Замените на правильное название вашей модели
-
Проверьте импорт модели: Убедитесь, что в файле, который вы загружаете с помощью
require('@/models')
, модели действительно доступны в объектеconn
. Возможно, вам нужно проверить структуру и порядок экспорта/импорта ваших моделей.const conn = require('@/models'); // Убедитесь, что эта переменная содержит ваши модели
-
Проверьте наличие модели: Добавьте некоторые отладочные сообщения, чтобы увидеть, что содержит
conn
и определена ли в нём ваша модель.console.log(conn); // Это выведет все доступные модели console.log(conn[MODEL_EMPLOYEEDOCUMENTS]); // Это покажет, определена ли конкретная модель
-
Код исправления: Если вы хотите сделать код более защищённым в отношении неопределённых значений, вы можете добавить проверки:
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);
Эти шаги и улучшения должны помочь вам диагностировать и исправить указанную вами ошибку. Убедитесь, что ваша структура данных и модели корректны, и ошибки, связанные с определением объектов, больше не будут возникать.