除非我重新启动服务器,否则不会加载一个 EJS 页面

One EJS page won't load unless I restart my server

这是给大家的。仅供参考,现在都是本地的。

我正在使用 ejs 构建一个简单的博客站点。每个页面都可以完美调用和加载...除了我的 post 页面。它停止运行,然后一旦我在我的终端中键入 'rs' 以启动它(这应该会清除我的 post 数组中的任何信息),它就会呈现!对我来说这没有意义,因为它如何知道在清除数组后要渲染什么?

我已经检查了几次代码,但我想我会联系你们这些优秀的人来帮助我。

有什么想法吗?

这是我的代码

...

const express = require("express");
const bodyParser = require("body-parser");
const ejs = require("ejs");
const _ = require("lodash");

const app = express();

app.set('view engine', 'ejs');

app.use(bodyParser.urlencoded({extended: true}));
app.use(express.static("public"));

//global post array

let posts =[];


//home logic

app.get("/", function (req, res) {
  res.render("home", {
    startingContent:homeStartingContent,
    posts: posts} );
});

// about logic

app.get("/about", function (req, res) {
  res.render("about", {aboutContent:aboutContent});
  
});

//contact logic

app.get("/contact", function (req, res) {
  res.render("contact", {contactContent:contactContent});
  
});

//compose logic

app.get("/compose", function (req, res){
 
  res.render("compose");


});


app.post('/compose', function(req, res) {

const postContent = {
  title: req.body.postTitle,
  content: req.body.postBody
}; 

posts.push(postContent);

res.redirect("/")


});

//Routing Parameters

app.get("/posts/:postName", function(req, res){
 
const requestedTitle = _.lowerCase(req.params.postName);

posts.forEach(function(post){

const storedTitle = _.lowerCase(post.title);
   
  if (storedTitle === requestedTitle) {
    res.render("post", {
      title: post.title,
      content: post.content
    });
  };
  
});


});


app.listen(3000, function() {
  console.log("Server started on port 3000");
});

...

我的post.ejs代码

...

<%- include('partials/header'); -%>

<h1><%=title%></h1>
<p><%=content%></p>



<%- include('partials/footer'); -%>

..

尝试先完成迭代并找到(或不找到)相关的 post。在那之后,如果 没有 找到,你仍然要发送一些东西作为回应:

app.get("/posts/:postName", (req, res) => {
  const requestedTitle = _.lowerCase(req.params.postName);
  const post = posts.find((post) => _.lowerCase(post.title) === requestedTitle);

  if (post) {
    res.render("post", {
      title: post.title,
      content: post.content
    });
  } else {
    // of course, you must have error page for this to work
    res.status(404).render("error", {
      message: `Post "${requestedTitle}" not found`,
    });
  }
});

我从代码中删除了循环,而是创建了两个满足我要求的常量。这段代码是一位同事向我推荐的。

app.get("/posts/:postName", function (req,res) {
  const requestedTitle = _.lowerCase(req.params.postName);
  
  //Put the req.params.postName constant into a new constant instead of 
  putting it in a loop.
  const storedTitle = posts.filter((post) => (
    _.lowerCase(post.title) === requestedTitle)
  );
    //reroute to homepage
    if (storedTitle.length === 0) {
      res.redirect('/');
     //otherwise render the page that was called
    } else {
      res.render('post', {
        title: storedTitle[0].title,
        content: storedTitle[0].content
      })
    }

})