首页 > 解决方案 > Why do I get an EJS syntax error when trying to print strings from an array?

问题描述

I am developing my first real web application and am currently doing so using Node, Express and MongoDB. All data in my database follows the pattern {question: String, learningDate: Date}. I want to create a page to which the questions are printed under their respective dates. For example, if two questions have the same date value, they should both be printed under the one and same date. In an attempt to achieve this, I have written the code found below.

When I run the application I am faced with the following error: "SyntaxError: Unexpected token ; in /path/to/file/views/home.ejs while compiling ejs"

I have tried playing around with the code for a while now, but cannot figure out what is causing the issue? Does anyone have any ideas how to fix this error, or otherwise, suggestions on how I could approach achieving my desired functionality differently?

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>

When I rewrite the code in "home.ejs" from scratch, I notice that the following code produces my error:

<% function getReviewsByDate(reviews, learningDate) %>
<% { %>
    <% let reviewsOnDate = []; %>
    <% learningDate = learningDate.valueOf(); %>
    <% reviews.forEach(function(reivew) %>
    <% { %>
        <% if (review.learningDate.valueOf() === learningDate) %>
        <% { %>
            <% reviewsOnDate.push(review); %>
        <% } %>
    <% }); %>
<% } %>

Update 1 Rewriting the excerpted code from "home.ejs" to the below code solves the syntax error.

<% 
function getReviewsByDate(reviews, learningDate)
{
    let reviewsOnDate = [];
    learningDate = learningDate.valueOf();
    reviews.forEach(function(reivew)
    {
        if (review.learningDate.valueOf() === learningDate)
        {
            reviewsOnDate.push(review);
        }
    });
} 
%>

Nevertheless, the same syntax error message returns when the below code is re-included in "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>
        <% }); %>
    <% } %>
<% } %>

标签: javascriptnode.jsexpressejs

解决方案


也许更换

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

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

推荐阅读