El código se ejecuta al principio, pero en el momento en que envío mi primera solicitud de publicación, aparece el siguiente error:
nodo:eventos:504 lanzar er; // Evento 'error' no manejado ^
TypeError: no se pueden leer las propiedades de nulo (leyendo 'nombre')
Actualmente usando: Node.js, mangosta
Paquetes utilizados: express, bodyParser, ejs, Mongoose
Código de archivo JS:
const express = require("express"); const app = express(); app.use(express.static("public")); const bodyParser = require("body-parser"); app.use(bodyParser.urlencoded({extended: true})); const ejs = require("ejs"); app.set("view engine", "ejs"); const mongoose = require('mongoose'); mongoose.connect("mongodb://localhost:27017/learndb"); const questionSchema = { question : String, answer : String }; const Question = mongoose.model("Question", questionSchema); const subjectSchema = { name : String, questions : [questionSchema] }; const Subject = mongoose.model("Subject", subjectSchema); app.post("/", function(req, res) { const subjectName= req.body.subjectName; const subject = new Subject({ name: subjectName}); subject.save(); res.redirect("/"); }); app.get("/", function(req, res) { Subject.find({}, function(err, foundSubjects) { res.render("home", {whichSubjects: foundSubjects}); }); });Código de archivo HTML/EJS:
<body> <h1>Choose a Subject</h1> <% whichSubjects.forEach(function(eachSubject) { %> <div class=""> <form class="" action="/<%=eachSubject.name%>" method="get"> <button type="submit" name="button"> <%=eachSubject.name%></button> </form> </div> <% }) %> <div class=""> <form class="" action="/" method="post"> <input type="text" name="subjectName" value=""> <button type="submit" name="button">Add A Subject</button> </form> </div> </body>La respuesta era tan simple pero nos la perdimos. Lo primero que está mal en tu código son las rutas. Tienes dos caminos llamados / . Desea hacer que su ruta de inicio sea el lugar donde visualiza todos los datos y luego crear un formulario que publique los datos en una ruta diferente y, en caso de éxito, debería redirigir a su ruta de inicio. En su caso, todo lo que tiene que hacer es cambiar la ruta de publicación en hmtl a /addsubject y en el archivo js a app.post('/addsubject' rest of code
//Generate express app const express = require('express'); const app = express(); app.set('views', './views'); app.set('view engine', 'ejs'); //Generate body parser const bodyParser = require('body-parser'); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: true })); //Connect to MongoDB const mongoose = require('mongoose'); mongoose.connect('mongodb://localhost:27017/learndb'); const subJectSchema = new mongoose.Schema({ name: String, questions: [{type: String}] }) const Subject = mongoose.model('Subject', subJectSchema); app.post('/addsubject', (req, res) => { const subjectName = req.body.subjectName; const subject = new Subject({ name: subjectName }); subject.save((err, subject) => { if (err) { console.log(err); } else { console.log("User Saved"); } }); res.redirect('/'); }); app.get('/', (req, res) => { Subject.find({}, (err, subjects) => { if (err) { console.log(err); } else { res.render('home', { subjectList: subjects }); } }); }); app.listen(4000, () => { console.log('Server started on port 3000'); }); <body> <h1>Choose Subject</h1> <div> <form action="/addsubject" method="post"> <label for="name">Name</label> <input type="text" name="subjectName" id="name"> <input type="submit" value="Create Subject"> </form> </div> <% if(subjectList.length> 0){ %> <% subjectList.forEach(subject=>{ %> <p> <%= subject.name %> </p> <% }) %> <% } else { %> <p>No subjects found Add Some</p> <% } %> </body>