SyntaxError: Неожиданный токен || в / var / www/html/views/components/show.ejs при компиляции ejs - PullRequest
0 голосов
/ 17 марта 2020

Я пытаюсь создать нечто похожее на проект Колта Стила YelpCamp из его веб-разработки Dev Bootcamp на Udemy. Мой проект работал до рефакторинга к концу курса, используя предоставленный материал YouTube. Я получаю следующее сообщение об ошибке при попытке отобразить что-либо из базы данных:

SyntaxError: Unexpected token || in /var/www/html/views/components/show.ejs while compiling ejs

If the above error is not helpful, you may want to try EJS-Lint:
https://github.com/RyanZim/EJS-Lint
Or, if you meant to create an async function, pass `async: true` as an option.
    at new Function (<anonymous>)
    at Template.compile (/var/www/html/node_modules/ejs/lib/ejs.js:626:12)
    at Object.compile (/var/www/html/node_modules/ejs/lib/ejs.js:366:16)
    at handleCache (/var/www/html/node_modules/ejs/lib/ejs.js:215:18)
    at tryHandleCache (/var/www/html/node_modules/ejs/lib/ejs.js:254:16)
    at View.exports.renderFile [as engine] (/var/www/html/node_modules/ejs/lib/ejs.js:459:10)
    at View.render (/var/www/html/node_modules/express/lib/view.js:135:8)
    at tryRender (/var/www/html/node_modules/express/lib/application.js:640:10)
    at Function.render (/var/www/html/node_modules/express/lib/application.js:592:3)
    at ServerResponse.render (/var/www/html/node_modules/express/lib/response.js:1012:7)
    at /var/www/html/routes/components.js:84:17
    at /var/www/html/node_modules/mongoose/lib/model.js:4834:16
    at /var/www/html/node_modules/mongoose/lib/helpers/promiseOrCallback.js:24:16
    at /var/www/html/node_modules/mongoose/lib/model.js:4857:21
    at _hooks.execPost (/var/www/html/node_modules/mongoose/lib/query.js:4366:11)
    at /var/www/html/node_modules/kareem/index.js:135:16

Мой / components / show (по существу, campgrounds / show) код выглядит следующим образом:

<%- include ("../partials/header") %>
<title><%=component.name%></title>
<%- include ("../partials/nav") %>
  <div class="row">
    <div class="col-md-3">
      <p class="lead">PC Part Inventory</p>
      <div class="list-group">
        <li class="list-group-item active">Info 1</li>
        <li class="list-group-item">Info 2</li>
        <li class="list-group-item">Info 3</li>
      </div>
    </div>
    <div class="col-md-9">
      <div class="card mb-3">
        <img class="card-img-top" src="<%= component.image %>" alt="<%= component.name %>">
        <div class="card-body">
          <p class="float-right">
            This item costs $<%= component.price %>
          </p>
          <h5 class="card-title"><%= component.name %></h5>
          <p>
            <em>Submitted By <%= component.author.username %>, <%= moment(component.createdAt).fromNow() %></em>
          </p>
          <hr>
          <p class="card-text"><%= component.description %></p>
          <% if(currentUser && component.author.id.equals(currentUser._id) || currentUser && currentUser.isAdmin){ %>
            <a class="btn btn-xs btn-warning" href="/components/<%= component._id %>/edit">Edit</a>
            <form class="delete-form" action="/components/<%= component._id %>?_method=DELETE" method="post">
              <button class="btn btn-xs btn-danger">Delete</button>
            </form>
          <% } %>
        </div>
      </div>
      <div class="card">
        <div class="card-body">
          <a class="btn btn-success" href="/components/<%= component._id %>/comments/new">Add a Comment</a>
        </div>
        <hr>
          <% component.comments.forEach(function(comment){ %>
            <div class="row">
              <div class="col-md-12">
                <strong><%= comment.author.username %></strong>
                <span class="pull-right"><%= moment(comment.createdAt).fromNow() %></span>
                <%= comment.text %>
                <% if(currentUser && comment.author.id.equals(currentUser._id)) || currentUser && currentUser.isAdmin){ %>
                  <a class="btn btn-xs btn-warning"
                    href="/components/<%= component._id %>/comments/<%= comment._id %>/edit">Edit</a>
                  <form class="delete-form" action="/components/<%= component._id %>/comments/<%= comment._id %>?_method=DELETE" method="post">
                    <input type="submit" class="btn btn-xs btn-danger" value="Delete">
                  </form>
                </div>
                <% } %>
              </div>
            </div>
          <% }); %>
      </div>
    </div>
<%- include ("../partials/footer") %>

И мой маршруты / компоненты. js Файл выглядит следующим образом:

var express    = require("express");
var router     = express.Router();
var Component  = require("../models/component");
var Comment    = require("../models/comment");
var middleware = require("../middleware");
var {isLoggedIn, checkComponentOwnership, checkCommentOwnership, isAdmin} = middleware;

// Defining escapeRegex for search feature
function escapeRegex(text) {
  return text.replace
};


//INDEX- show inventory
router.get("/", function(req, res){
  if (req.query.search && req.xhr) {
    var regex = new RegExp(escapeRegex(req.query.search), 'gi');
    //Getting Inventory
    Component.find({name: regex}, function(err, allComponents){
      if(err){
        console.log(err);
      } else {
        res.status(200).json(allComponents);
      }
    });
  } else {
    // Get Items from DB
    Component.find({}, function(err, allComponents){
      if(err){
        console.log(err);
      } else {
        if(req.xhr) {
          res.json(allComponents);
        }
        else {
          res.render("components/components", {components: allComponents, page: 'components'});
        }
      }
    });
  }
});

// CREATE- Add Components to DB
router.post("/", isLoggedIn, function(req, res){
  //Get form data and add to array- add here with invSchema
  var name  = req.body.name;
  var image = req.body.image;
  var desc  = req.body.description; //Add stuff from invSchema here
  var author = {
    id      : req.user._id,
    username: req.user.username
  }
  var cost  = req.body.cost;
  var newComponent = {name: name, image: image, cost: cost, description: desc, author:author};
  // Create a new component
  Component.create(newComponent, function(err, newlyAdded){
    if(err){
      console.log(err);
    } else {
      //redirect back to Inventory page
      console.log(newlyAdded);
      res.redirect("/components");
    }
  });
});

// NEW= Take to Inventory form
router.get("/new", isLoggedIn, function(req, res){
  res.render("components/new");
});

//SHOW- shows info on specific component
router.get("/:id", function(req, res){
    //find component by idea
    Component.findById(req.params.id).populate("comments").exec(function(err, foundComponent){
        if(err){
            console.log(err);
            req.flash('error', 'No components are listed under that name.');
            return res.redirect('/components');
        } else {
            console.log(foundComponent)
            //render show template with that component
            res.render("components/show", {component: foundComponent});
        }
    });
});

//EDIT COMPONENT ROUTE
router.get("/:id/edit", checkComponentOwnership, isLoggedIn, function(req, res){
  //Find the component
  Component.findById(req.params.id, function(err, foundComponent){
    if(err){
      console.log(err);
      req.flash('error', 'Unable to edit component')
    } else{
      res.render("components/edit", {component: foundComponent});
    }
  });
});

// UPDATE COMPONENT ROUTE
router.put("/:id", checkComponentOwnership, function(req, res){
    var newData = {name: req.body.name, image: req.body.image, cost: req.body.cost, description: req.body.description};
    Component.findByIdAndUpdate(req.params.id, {$set: newData}, function(err, component){
      if(err){
        req.flash("error", err.message)
        res.redirect("back");
      } else {
        req.flash("success", "Component has been updated successfully")
        res.redirect("/components/" + req.params.id);
      }
    });
  });

// DESTROY Route
router.delete("/:id", checkComponentOwnership, isLoggedIn, function(req, res){
  Comment.remove({
    _id: {
      $in: req.component.comments
    }
  }, function(err) {
      if(err){
        req.flash('error', err.message);
        res.redirect('/');
      } else{
        req.component.remove(function(err) {
          if(err){
            req.flash('error', err.message);
            res.redirect('/');
          }
            req.flash('error', 'Component Removed');
            res.redirect('/components');
        });
      }
  });
});

module.exports = router;

Есть идеи, что я могу делать неправильно?

1 Ответ

0 голосов
/ 18 марта 2020

В строке 45 есть дополнительная закрывающая скобка после вызова comment.author.id.equals(currentUser._id).

<% if(currentUser && comment.author.id.equals(currentUser._id)) || currentUser && currentUser.isAdmin){ %>
  <!--                                                      ^^^^             -->
  <a class="btn btn-xs btn-warning"
    href="/components/<%= component._id %>/comments/<%= comment._id %>/edit">Edit</a>
  <form class="delete-form" action="/components/<%= component._id %>/comments/<%= comment._id %>?_method=DELETE" method="post">
    <input type="submit" class="btn btn-xs btn-danger" value="Delete">
  </form>
</div>
<% } %>

В сообщении об ошибке также предлагается использовать ejs-lint для получения более полезных сообщений об ошибках. Я бы порекомендовал попробовать это. В этом случае напечатано:

Unexpected token (45:81) in test.ejs
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...