Почему я получаю синтаксическую ошибку EJS при попытке печати строк из массива? - PullRequest
0 голосов
/ 23 октября 2018

Я занимаюсь разработкой своего первого настоящего веб-приложения и в настоящее время использую 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>
        <% }); %>
    <% } %>
<% } %>

1 Ответ

0 голосов
/ 23 октября 2018

Возможно заменить

<h4> <%= formatDate(getReviewDate(learningDate, reviewNumber)) %> </h4>

на

<h4> <%- formatDate(getReviewDate(learningDate, reviewNumber)) %> </h4>
...