简体   繁体   中英

EJS not templating all properties from given object

So I am trying to template a JSON object to an ejs view. However, only some of the properties from the given object are being templated onto the view. When I run my website on localhost, it works fine, but when I run it on my VPS where the same code is deployed, it doesn't work.

Here's what the object looks like:

{
    "_id" : ObjectId("5e5d9492bbb5f314b03a07b5"),
    "date" : "Mon Mar 02 2020",
    "author" : "hello",
    "title" : "Fake Blog Post on How to Rig a Rod",
    "content" : "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque lacinia viverra ultricies. Duis vel dui ante. Nulla venenatis ornare lorem et ornare. Phasellus vestibulum viverra diam quis pulvinar. Curabitur sit amet ultricies purus. Donec a pretium justo. Mauris pharetra, nisl ac vehicula pulvinar, diam sapien fringilla enim, auctor eleifend lorem justo et turpis. Nam eget tristique velit. Sed gravida sapien sed nisl sodales, eget scelerisque arcu tristique. Phasellus molestie neque in suscipit pulvinar. Nunc nec lectus quis lorem consequat accumsan. Praesent nec odio placerat, bibendum dolor sit amet, rhoncus quam. Donec et lacus eu felis sollicitudin porttitor. Cras nec aliquet neque. Donec erat risus, porttitor ac pharetra sit amet, mattis vel est. Morbi vel malesuada tellus. Proin non congue purus, vitae dapibus lacus. Curabitur lacinia urna vel sapien euismod rutrum. Pellentesque feugiat orci a mi consectetur suscipit. Duis sed eros at dui facilisis dictum. Cras enim turpis, imperdiet vel lacus id, pulvinar rhoncus risus. Donec molestie turpis ipsum, ac ullamcorper orci pharetra non. Pellentesque ut quam congue, feugiat nisl vel, sagittis ipsum. Pellentesque facilisis tempor tristique. Mauris condimentum egestas lectus a luctus. Proin eget ullamcorper ligula. Sed semper quis est ac condimentum. Vivamus sed velit dolor. Sed aliquam sollicitudin orci a pretium. Nulla quis sem vel turpis facilisis bibendum quis vel tellus. In hac habitasse platea dictumst. Sed feugiat vestibulum condimentum. Morbi sit amet pharetra orci. Etiam accumsan elit eu erat eleifend pulvinar. Vestibulum blandit gravida scelerisque.Proin non ex lobortis, suscipit purus tristique, blandit metus. Vivamus sit amet mi at lectus gravida luctus sed eget purus. Donec laoreet nec nulla quis sagittis. Cras ut eros efficitur, dictum felis vitae, cursus tortor. Sed varius ante non sapien malesuada, vitae tempor orci tincidunt. In lacus risus, efficitur ut erat vel, lacinia vulputate velit. Sed orci ligula, venenatis sed nisi id, varius scelerisque diam. In ut volutpat ligula, nec sodales sem. Lorem ipsum dolor sit amet, consectetur adipiscing elit. In fermentum ac neque non suscipit. Cras aliquam, eros sed molestie lacinia, dolor dui suscipit purus, ac maximus quam leo a magna. Mauris sed ipsum a magna hendrerit interdum at non erat. Sed blandit elementum libero quis placerat. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur semper auctor augue vel laoreet. Aliquam ac interdum dui, ullamcorper malesuada justo. Proin non efficitur lectus. Nam quam arcu, laoreet in volutpat non, condimentum vulputate nulla. Phasellus sit amet tellus facilisis odio dignissim maximus. Proin accumsan volutpat nunc, id pulvinar mi consequat ut. Pellentesque nec congue libero. Cras mauris nisl, pharetra sit amet semper ut, sodales quis urna. Aenean mollis quam felis, id cursus nunc pulvinar sed. Sed a urna pharetra, hendrerit massa ac, sodales urna. Pellentesque nec congue mi, in condimentum mi. Aliquam lacinia lacus at venenatis ultricies.",
    "__v" : 0
}

Here's what the ejs file looks like:

<!DOCTYPE html>
<html>

<head>
  <title>Rig Guides</title>
  <%- include ('partials/product_head') %>
</head>

<body>

  <!-- ========= NAV BAR ============= -->
  <%- include ('partials/navbar') %>
  <div id="build-title" class=" py-5">
    <h6 class="text-center dark-blue text-uppercase">Rig Guide</h6>
    <h3 class="text-center bold-font"><%= post.title %></h3>
    <h5 class="text-center">By <%= post.author %></h5>
  </div>
  <div class="container-fluid guide-container">
    <div class="row justify-content-center">
      <div class="col-xl-6 col-lg-8 col-md-8">
        <p class="guide-content my-5 py-2"><%= post.content %></p>
      </div>
    </div>
  </div>


  <%- include ('partials/footer') %>
  <script src="js/guide.js"></script>
</body>

</html>

and here's the output on my deployed website at rodrigger.com image of website

As you can see, the title and content values are templated onto the page, but the value for the property "author" is not templated b/c it should say "By [Author]"

Apparently, the issue had to do with the DB and the data being retrieved from it.

I used this call to get the data from the DB:

 var data = await Guide.find({
    title: req.params.title
  }).exec();

I added this line just in case there was some "defect" in the data if that's what you'd call it.

data = JSON.parse(JSON.stringify(data)):

and sure enough, EJS was able to correctly template the data. Then I realized.find() in mongoose returns the actual Mongoose Document and not a Javascript Object which is probably why EJS couldn't template the data. So I then used.lean() and it solved my issue.

var data = await Guide.find({
    title: req.params.title
  }).lean().exec();

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM