【问题标题】:One EJS page won't load unless I restart my server除非我重新启动服务器,否则不会加载一个 EJS 页面
【发布时间】:2021-12-30 06:44:52
【问题描述】:

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

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

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

有什么想法吗?

这是我的代码

...

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'); -%>

..

【问题讨论】:

  • storedTitle === requestedTitlefalse 时会发生什么?
  • 它将默认为标准错误页面,但让我尝试添加一个 else 语句。也许这会解决它。 :)
  • Dima,我用简单的console.log("No Match Found")添加了一个else语句,结果是一样的。

标签: javascript arrays ejs render


【解决方案1】:

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

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
      })
    }

})

【讨论】:

    【解决方案2】:

    尝试先完成迭代并找到(或不)相关帖子。之后,如果 找到,您仍然需要发送一些内容作为响应:

    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`,
        });
      }
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-09
      • 1970-01-01
      • 2017-02-16
      • 1970-01-01
      • 1970-01-01
      • 2012-05-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多