Aquí hay uno para todos ustedes. FYI, todo esto es local en este momento.
Estoy construyendo un sitio de blog simple con ejs. Todas las páginas se pueden llamar y se cargan perfectamente... a excepción de mi página de publicación. Se detiene y luego, una vez que escribo 'rs' en mi terminal para iniciarlo (lo que debería borrar mi matriz de publicaciones de cualquier información), ¡se procesa! Para mí, esto no tiene sentido porque, ¿cómo sabría qué representar después de que se haya borrado la matriz?
Revisé el código un par de veces, pero pensé que me comunicaría con ustedes, buenas personas, para que me ayudaran.
¿Algunas ideas?
Aquí está mi código
...
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"); });...
mi código post.ejs
...
<%- include('partials/header'); -%> <h1><%=title%></h1> <p><%=content%></p> <%- include('partials/footer'); -%>..
Eliminé el bucle del código y, en su lugar, creé dos constantes que satisfacían mis requisitos. Este código me lo sugirió un colega.
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 }) } })Intente primero terminar la iteración y encontrar (o no) la publicación relacionada. Después de eso, si no se encuentra, aún debe enviar algo como respuesta:
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`, }); } });