в phone.ejs не выводится дата добавления коммента:

app.js:

const express = require("express");
const ejs = require("ejs");
const mongoose = require("mongoose");
const request = require("request");
const cheerio = require("cheerio");
const fs = require("fs");

const app = express();

// Установка EJS в качестве шаблонизатора
app.set('view engine', 'ejs');

// Подключение к MongoDB
mongoose.connect('mongodb://127.0.0.1/phoneNumbers', { useNewUrlParser: true, useUnifiedTopology: true })
  .then(() => {
    console.log("Соединение с MongoDB установлено");
  })
  .catch((err) => {
    console.error("Ошибка подключения к MongoDB:", err);
  });

// Определение схемы и модели для хранения номеров телефонов
const PhoneNumberSchema = new mongoose.Schema({
  number: { type: String, index: true },
  url: String,
  comments: [String],
  callType: String,
  dateAdded: { type: Date, default: Date.now }
});

const PhoneNumber = mongoose.model('PhoneNumber', PhoneNumberSchema, 'phoneNumbers');

// Функция для получения HTML-кода страницы
function getHtml(url) {
  return new Promise((resolve, reject) => {
    request(url, (error, response, html) => {
      if (error) {
        reject(error);
      } else {
        resolve(html);
      }
    });
  });
}

// Функция для получения номеров телефонов и сохранения их в базе данных
async function getNewPhoneNumbers() {
  console.log("Запущен процесс поиска новых номеров...");

  try {
    const phoneNumbers = await PhoneNumber.find().sort({ _id: -1 }).limit(100).select('number url comments callType').exec();
    const lastPageUrl = phoneNumbers.length > 0 ? phoneNumbers[0].url : null;
    const newPhoneNumbers = [];

    // Получить HTML-код первой страницы с номерами телефонов
    const firstPageUrl = "https://zvonili.com/";
    const firstPageHtml = await getHtml(firstPageUrl);

    // Использовать Cheerio для парсинга HTML-кода и извлечения информации о номере телефона
    const $firstPage = cheerio.load(firstPageHtml);
    const phoneElements = $firstPage(".card-header");

    phoneElements.each(async (index, element) => {
      const phoneNumber = $firstPage(element).find(".nomerlnk").text().trim();
      const url = $firstPage(element).find(".nomerlnk").attr("href");
      const comments = $firstPage(element).next().find("blockquote").text().trim().replace(/\s*[\[\(]?\s*(Опросы|Реклама|Мошенники|Неадекваты)\s*[\]\)]?\s*/gi, '');
      const callTypeElements = $firstPage(element).next().find("span.type");
      const callType = callTypeElements.length > 0 ? callTypeElements.map((index, element) => $firstPage(element).text().trim()).get().join(", ") : "";

      // Добавить новый номер телефона в массив, если его еще нет в базе данных
      const existingPhoneNumber = phoneNumbers.find((phone) => phone.number === phoneNumber);
      if (!existingPhoneNumber) {
        newPhoneNumbers.push({ number: phoneNumber, url: url, comments: [comments], callType: callType });
      } else if (!existingPhoneNumber.comments.includes(comments)) {
        existingPhoneNumber.comments.push(comments);
        await PhoneNumber.updateOne({ number: existingPhoneNumber.number }, { comments: existingPhoneNumber.comments });
        console.log(`Комментарий "${comments}" добавлен к номеру ${phoneNumber}`);
      }
    });

    console.log(`Найдено ${newPhoneNumbers.length} новых номеров телефонов.`);

    // Сохранить новые номера телефонов в базе данных
    if (newPhoneNumbers.length > 0) {
      for (const phoneNumber of newPhoneNumbers) {
        const existingPhoneNumber = phoneNumbers.find((phone) => phone.number === phoneNumber.number);
        if (!existingPhoneNumber) {
			phoneNumber.dateAdded = new Date(); // устанавливаем дату
          await PhoneNumber.create(phoneNumber);
		  
        }
      }
    }
  } catch (err) {
    console.error("Ошибка при поиске новых номеровтелефонов:", err);
  }
}

function mergeComments(phoneNumbers) {
  const result = [];

  phoneNumbers.forEach((phoneNumber) => {
    const existingEntry = result.find((entry) => entry.number === phoneNumber.number);

    if (!existingEntry) {
      result.push({
        number: phoneNumber.number,
        url: phoneNumber.url,
        comments: [...phoneNumber.comments],
        callType: phoneNumber.callType,
      });
    } else {
      existingEntry.comments.push(...phoneNumber.comments);
      existingEntry.comments = Array.from(new Set(existingEntry.comments));
    }
  });

  return result;
}

// Отображение списка номеров телефонов на главной странице
app.get('/', async (req, res) => {
  try {
    const phoneNumbers = await PhoneNumber.find().sort({ _id: -1 }).limit(100).select('number url comments callType').exec();
    res.render('index', { phoneNumbers: phoneNumbers });
  } catch (err) {
    console.error("Ошибка при получении списка номеров телефонов:", err);
    res.status(500).send("Ошибка при получении списка номеров телефонов");
  }
});

app.get("/phone/:number", async (req, res) => {
  const phoneNumbers = await PhoneNumber.find({ number: req.params.number });
  const mergedPhoneNumbers = mergeComments(phoneNumbers);

  if (mergedPhoneNumbers.length > 0) {
    res.render("phone", { 
  number: mergedPhoneNumbers[0].number, 
  comments: mergedPhoneNumbers[0].comments, 
  callType: mergedPhoneNumbers[0].callType,
   dateAdded: mergedPhoneNumbers[0].dateAdded ? mergedPhoneNumbers[0].dateAdded.toISOString() : null
 
});
  } else {
    res.status(404).send("Номер телефона не найден");
  }
});

// Запуск сервера
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
  console.log(`Сервер запущен на порту ${PORT}`);
});

// Запуск процесса поиска новых номеров телефонов каждые 10 минут
setInterval(getNewPhoneNumbers, 5 * 10 * 1000);

phone.ejs:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Номер телефона <%= number %></title>
    <!-- Подключение Bootstrap CSS -->
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/5.1.3/css/bootstrap.min.css">
    <!-- Подключение Font Awesome CSS -->
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css">
    <!-- Подключение кастомных стилей CSS -->
    <link rel="stylesheet" href="/styles.css">
  </head>
  <body>
    <div class="container">
      <h1 class="my-5">Номер телефона <%= number %></h1>
      <% if (comments && comments.length > 0) { %>
        <div class="card mb-3">
          <div class="card-header">Комментарии</div>
          <ul class="list-group list-group-flush">
            <% comments.reverse().forEach((comment) => { %>
              <li class="list-group-item"><%= comment %>
                <% if (dateAdded) { %>
                  <p class="my-2">Добавлен: <%= new Date(dateAdded).toISOString() %></p>
                <% } else { %>
                  <p class="my-2"></p>
                <% } %>
              </li>
            <% }); %>
          </ul>
        </div>
      <% } else { %>
        <p>Нет комментариев для этого номера телефона.</p>
      <% } %>
      <% if (callType) { %>
        <p class="my-2">Тип звонка: <%= callType %></p>
      <% } %>
      <a href="/" class="btn btn-primary">Назад к списку номеров телефонов</a>
    </div>
    <!-- Подключение Bootstrap JS -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/5.1.3/js/bootstrap.bundle.min.js"></script>
  </body>
</html>

Вероятно, проблема заключается в том, что вы не передаете dateAdded для каждого комментария. Вместо этого, вы передаете одно значение dateAdded для всей страницы.
Чтобы исправить это, сначала измените структуру PhoneNumberSchema:
javascript
Copy code

const CommentSchema = new mongoose.Schema({
  text: String,
  dateAdded: { type: Date, default: Date.now }
});

const PhoneNumberSchema = new mongoose.Schema({
  number: { type: String, index: true },
  url: String,
  comments: [CommentSchema],
  callType: String
});
Теперь при добавлении нового комментария используйте следующий код:
javascript
Copy code

if (!existingPhoneNumber.comments.find((comment) => comment.text === comments)) {
    existingPhoneNumber.comments.push({ text : comments });
    await PhoneNumber.updateOne(
        { number : existingPhoneNumber.number },
        { $push : {"comments" : {text : comments}}}
    );
    console.log(`Комментарий "${comments}" добавлен к номеру ${phoneNumber}`);
}
И наконец, обновите ваш шаблон phone.ejs чтобы показывать дату добавления для каждого комментария:
html
Copy code

<% if (comments && comments.length > 0) { %>
	<div class="card mb-3">
	    <div class="card-header">Комментарии</div>
	    <ul class="list-group list-group-flush">
	        <% comments.reverse().forEach((commentObj) => { %>
	            <li class="list-group-item"><%= commentObj.text %></p>
	                <% if (commentObj.dateAdded) { %>
	                    <p class="my-2">Добавлен: <%= new Date(commentObj.dateAdded).toISOString() %></p>
	                <% } else { %>
	                    <p class="my-2"></p>
	                <% } %>
	            </li>
	        <% }); %>
	    </ul>
	</div> 
<% } else { %> 
...
Обнови весь код с учетом изменений