Я занимаюсь разработкой своего первого настоящего веб-приложения и в настоящее время использую Node, Express и MongoDB.Все данные в моей базе данных следуют схеме {question: String, learningDate: Date}
.Я хочу создать страницу, на которой вопросы будут напечатаны под соответствующими датами.Например, если два вопроса имеют одинаковое значение даты, они должны быть напечатаны под одной и той же датой.Пытаясь добиться этого, я написал приведенный ниже код.
Когда я запускаю приложение, я сталкиваюсь со следующей ошибкой: "SyntaxError: неожиданный токен; в / path / to / file / views /home.ejs во время компиляции ejs "
Я некоторое время пытался поиграться с кодом, но не могу понять, что является причиной проблемы?У кого-нибудь есть идеи, как исправить эту ошибку, или нет, предложения о том, как мне по-другому подойти к достижению желаемой функциональности?
app.js (https://pastebin.com/bhZdcNzJ)
const express = require("express");
const mongoose = require("mongoose");
const app = express();
app.set("view engine", "ejs");
mongoose.connect("mongodb://localhost/review1");
const reviewSchema = mongoose.Schema(
{
question: String,
learningDate: Date
}
)
const Review = mongoose.model("Review", reviewSchema);
app.get("/", function(req, res)
{
Review.find({}, function(err, reviews)
{
if (err)
{
console.log("Something went wrong.");
console.log(err);
}
else
{
res.render("home", {reviews: reviews});
}
});
});
app.listen(3000, function()
{
console.log("Active Recall server is listening on port 3000.")
});
home.ejs (https://pastebin.com/e0bN20Yz)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8"/>
<meta name="author" content="Konrad M. L. Claesson"/>
<meta name="viewport" content="width=device-width, initial-sacle=1"/>
<title>Active Recall</title>
</head>
<body>
<h1>Active Recall</h1>
<%
const days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
const months = ["January", "February", "March", "April", "May", "June",
"July", "August", "September", "October", "November", "December"]
function formatDate(date)
{
var day = days[date.getDay()];
var month = months[date.getMonth()];
var dd = date.getDate();
var yyyy = date.getFullYear();
return day + ", " + dd + " " + month + " " + yyyy;
}
%>
<%
function getReviewDate(learningDate, reviewNumber)
{
const reviewSpace = 2 * (Math.pow(2, reviewNumber) - 1) - reviewNumber;
let date = new Date();
date.setDate(learningDate.getDate() + reviewSpace);
return date;
}
%>
<% function getReviewsByDate(reviews, learningDate) %>
<% { %>
<% let reviewsOnDate = []; %>
<% learningDate = learningDate.valueOf(); %>
<% reviews.forEach(function(reivew) %>
<% { %>
<% if (review.learningDate.valueOf() === learningDate) %>
<% { %>
<% reviewsOnDate.push(review); %>
<% } %>
<% }); %>
<% } %>
<%
function removeReviewsByDate(reivews, learningDate)
{
reviews.forEach(function(reivew)
{
if (review.learningDate.valueOf() === learningDate)
{
let i = reviews.indexOf(review);
reviews.splice(i, 1);
}
});
}
%>
<% for (let i = reviews.length - 1; i > -1; i--) { %>
<% let learningDate = reviews[i].learningDate; %>
<% let reviewsOnDate = getReviewsByDate(reviews, learningDate); %>
<% removeReviewsByDate(reviews, learningDate); %>
<% for (let reviewNumber = 1; reviewNumber < 11; reviewNumber++) %>
<% { %>
<h4> <%= formatDate(getReviewDate(learningDate, reviewNumber)) %> </h4>
<% reviewsOnDate.forEach(function(review) %>
<% { %>
<li> <%= review.question %> </li>
<% }); %>
<% } %>
<% } %>
</body>
</html>
Когда я переписываю код в "home.ejs" с нуля, я замечаю, что следующий код выдает мою ошибку:
<% function getReviewsByDate(reviews, learningDate) %>
<% { %>
<% let reviewsOnDate = []; %>
<% learningDate = learningDate.valueOf(); %>
<% reviews.forEach(function(reivew) %>
<% { %>
<% if (review.learningDate.valueOf() === learningDate) %>
<% { %>
<% reviewsOnDate.push(review); %>
<% } %>
<% }); %>
<% } %>
Обновление 1 Перезапись приведенного кода из «home.ejs» в приведенный ниже код устраняет синтаксическую ошибку.
<%
function getReviewsByDate(reviews, learningDate)
{
let reviewsOnDate = [];
learningDate = learningDate.valueOf();
reviews.forEach(function(reivew)
{
if (review.learningDate.valueOf() === learningDate)
{
reviewsOnDate.push(review);
}
});
}
%>
Тем не менее, тот же синтаксиссообщение об ошибке возвращается, когда приведенный ниже код повторно включен в "home.ejs":
<% for (let i = reviews.length - 1; i > -1; i--) { %>
<% let learningDate = reviews[i].learningDate; %>
<% let reviewsOnDate = getReviewsByDate(reviews, learningDate); %>
<% removeReviewsByDate(reviews, learningDate); %>
<% for (let reviewNumber = 1; reviewNumber < 11; reviewNumber++) %>
<% { %>
<h4> <%= formatDate(getReviewDate(learningDate, reviewNumber)) %> </h4>
<% reviewsOnDate.forEach(function(review) %>
<% { %>
<li> <%= review.question %> </li>
<% }); %>
<% } %>
<% } %>