除非我重新启动服务器,否则不会加载一个 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
})
}
})
这是给大家的。仅供参考,现在都是本地的。
我正在使用 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
})
}
})