Node.js 在express上发出POST请求时,如何呈现EJS文件?

Node.js 在express上发出POST请求时,如何呈现EJS文件?,node.js,express,ejs,Node.js,Express,Ejs,我的应用程序有路径\,这是主页(工作) 它还有一个诗歌路径,在那里我可以看到诗歌列表(工作) 它还有一个poems/new路径,在那里我被要求添加一首新诗(这里是我需要帮助的地方) 我向本地主机上的路径poems/new发出GET请求:http://localhost:3000/poems/new 当页面加载时,我可以看到一个输入元素和一个按钮 期望的行为 输入文本后,我想: a) 正确地发出POST请求 b) 访问poems页面,查看用户键入的文本作为poems页面上诗歌列表的最后一项 实际行

我的应用程序有路径
\
,这是主页(工作)

它还有一个
诗歌
路径,在那里我可以看到诗歌列表(工作)

它还有一个
poems/new
路径,在那里我被要求添加一首新诗(这里是我需要帮助的地方)

我向本地主机上的路径
poems/new
发出
GET
请求:
http://localhost:3000/poems/new

当页面加载时,我可以看到一个输入元素和一个按钮

期望的行为

输入文本后,我想:

a) 正确地发出
POST
请求

b) 访问
poems
页面,查看用户键入的文本作为
poems
页面上诗歌列表的最后一项

实际行为

我在终端上看到的输出是:

GET /poems/new 200 28.877 ms - 378
GET /stylesheets/style.css 304 3.242 ms - -
POST /poems/new 404 35.646 ms - 149
t我在屏幕上看到的输出是:

无法发布/poems/new

应用程序文件

package.json

{
  "name": "poems",
  "version": "0.0.0",
  "private": true,
  "scripts": {
    "start": "node ./bin/www",
    "start-test-server": "node ./bin/www",
    "test": "jest",
    "test-coverage": "jest --coverage"
  },
  "dependencies": {
    "cookie-parser": "~1.4.4",
    "debug": "~2.6.9",
    "dotenv": "^8.2.0",
    "ejs": "~2.6.1",
    "errorhandler": "^1.5.1",
    "express": "~4.16.1",
    "morgan": "~1.9.1"
  },
  "jest": {
    "preset": "jest-puppeteer"
  },
  "devDependencies": {
    "jest": "^26.6.3",
    "jest-puppeteer": "^4.4.0",
    "pg": "^8.5.1",
    "puppeteer": "^8.0.0"
  }
}
app.js

var errorhandler = require('errorhandler');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');

var indexRouter = require('./routes/index');
var poemsRouter = require('./routes/poems')

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use(errorhandler());

app.use('/', indexRouter);
app.use('/poems', poemsRouter);

// error handler
app.use(function(err, req, res, next) {
  res.locals.message = err.message
  if (process.env.NODE_ENV === 'development') {
    // only use in development
    res.locals.error = err;
  }
  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

module.exports = app;
var express = require('express');
var router = express.Router();
const poem = require('../public/javascripts/poem')

/* GET poems list page. */
router.get('/', async function(req, res, next) {
  await poem.allPoems((allPoems) => {
    res.render('poems', { message: allPoems });
  });
});

/* GET add poem page. */
router.get('/new', function(req, res, next) {
  let content = req.body;
  console.log(content)
  res.render('addPoem', { message: content });
});

/* Add a new poem. */
router.post('/new'), function(req, res, next) {
  const message = req.body.content // not sure if this is even correct
  console.log(message)
 
  res.render('poems') // something like res.render('poems', { message: I_should_put_a_correct_vaiarable_name_here }) should probably happen here
}

module.exports = router;
<!DOCTYPE html>
<html>
  <head>
    <link rel='stylesheet' href='../public/stylesheets/style.css' />
  </head>
  <body>
    <ul>
      <!-- <%= message %> -->
      <%message.forEach(poem => {%>
      <li><%= poem.content %></li>
      <% }) %>
    </ul>
  </body>
</html>
<!DOCTYPE HTML>
<HTML>
  <head>
    <link rel='stylesheet' href='/stylesheets/style.css' />
 </head>
 <body>
    <form action="/poems/new" method="post">
      <!-- <%= message %> -->
      <label for="content"><%=message.content%></label>
      <input type="text" id="content" name="content" value="<%=   message.content %>">
      <button type="submit" value="add poem">add poem</button>
    </form>
  </body>
</html>
var express = require('express');
var router = express.Router();

/* GET home page. */
router.get('/', function(req, res, next) {
  res.render('index', { 
    title: 'Poems',
    message: 'Here you\'ll see poems' });
});

module.exports = router;
<!DOCTYPE html>
<html>
  <head>
    <title><%= title %></title>
    <link rel='stylesheet' href='/stylesheets/style.css' />
  </head>
  <body>
    <h1><%= title %></h1>
    <p>Welcome to <%= title %></p>
    <section id="poems"> <%= message %> </section>
  </body>
</html>
<h1><%= message %></h1>
<h2><%= error.status %></h2>
<pre><%= error.stack %></pre>
routes/poems.js

var errorhandler = require('errorhandler');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');

var indexRouter = require('./routes/index');
var poemsRouter = require('./routes/poems')

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use(errorhandler());

app.use('/', indexRouter);
app.use('/poems', poemsRouter);

// error handler
app.use(function(err, req, res, next) {
  res.locals.message = err.message
  if (process.env.NODE_ENV === 'development') {
    // only use in development
    res.locals.error = err;
  }
  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

module.exports = app;
var express = require('express');
var router = express.Router();
const poem = require('../public/javascripts/poem')

/* GET poems list page. */
router.get('/', async function(req, res, next) {
  await poem.allPoems((allPoems) => {
    res.render('poems', { message: allPoems });
  });
});

/* GET add poem page. */
router.get('/new', function(req, res, next) {
  let content = req.body;
  console.log(content)
  res.render('addPoem', { message: content });
});

/* Add a new poem. */
router.post('/new'), function(req, res, next) {
  const message = req.body.content // not sure if this is even correct
  console.log(message)
 
  res.render('poems') // something like res.render('poems', { message: I_should_put_a_correct_vaiarable_name_here }) should probably happen here
}

module.exports = router;
<!DOCTYPE html>
<html>
  <head>
    <link rel='stylesheet' href='../public/stylesheets/style.css' />
  </head>
  <body>
    <ul>
      <!-- <%= message %> -->
      <%message.forEach(poem => {%>
      <li><%= poem.content %></li>
      <% }) %>
    </ul>
  </body>
</html>
<!DOCTYPE HTML>
<HTML>
  <head>
    <link rel='stylesheet' href='/stylesheets/style.css' />
 </head>
 <body>
    <form action="/poems/new" method="post">
      <!-- <%= message %> -->
      <label for="content"><%=message.content%></label>
      <input type="text" id="content" name="content" value="<%=   message.content %>">
      <button type="submit" value="add poem">add poem</button>
    </form>
  </body>
</html>
var express = require('express');
var router = express.Router();

/* GET home page. */
router.get('/', function(req, res, next) {
  res.render('index', { 
    title: 'Poems',
    message: 'Here you\'ll see poems' });
});

module.exports = router;
<!DOCTYPE html>
<html>
  <head>
    <title><%= title %></title>
    <link rel='stylesheet' href='/stylesheets/style.css' />
  </head>
  <body>
    <h1><%= title %></h1>
    <p>Welcome to <%= title %></p>
    <section id="poems"> <%= message %> </section>
  </body>
</html>
<h1><%= message %></h1>
<h2><%= error.status %></h2>
<pre><%= error.stack %></pre>
视图/poems.ejs

var errorhandler = require('errorhandler');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');

var indexRouter = require('./routes/index');
var poemsRouter = require('./routes/poems')

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use(errorhandler());

app.use('/', indexRouter);
app.use('/poems', poemsRouter);

// error handler
app.use(function(err, req, res, next) {
  res.locals.message = err.message
  if (process.env.NODE_ENV === 'development') {
    // only use in development
    res.locals.error = err;
  }
  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

module.exports = app;
var express = require('express');
var router = express.Router();
const poem = require('../public/javascripts/poem')

/* GET poems list page. */
router.get('/', async function(req, res, next) {
  await poem.allPoems((allPoems) => {
    res.render('poems', { message: allPoems });
  });
});

/* GET add poem page. */
router.get('/new', function(req, res, next) {
  let content = req.body;
  console.log(content)
  res.render('addPoem', { message: content });
});

/* Add a new poem. */
router.post('/new'), function(req, res, next) {
  const message = req.body.content // not sure if this is even correct
  console.log(message)
 
  res.render('poems') // something like res.render('poems', { message: I_should_put_a_correct_vaiarable_name_here }) should probably happen here
}

module.exports = router;
<!DOCTYPE html>
<html>
  <head>
    <link rel='stylesheet' href='../public/stylesheets/style.css' />
  </head>
  <body>
    <ul>
      <!-- <%= message %> -->
      <%message.forEach(poem => {%>
      <li><%= poem.content %></li>
      <% }) %>
    </ul>
  </body>
</html>
<!DOCTYPE HTML>
<HTML>
  <head>
    <link rel='stylesheet' href='/stylesheets/style.css' />
 </head>
 <body>
    <form action="/poems/new" method="post">
      <!-- <%= message %> -->
      <label for="content"><%=message.content%></label>
      <input type="text" id="content" name="content" value="<%=   message.content %>">
      <button type="submit" value="add poem">add poem</button>
    </form>
  </body>
</html>
var express = require('express');
var router = express.Router();

/* GET home page. */
router.get('/', function(req, res, next) {
  res.render('index', { 
    title: 'Poems',
    message: 'Here you\'ll see poems' });
});

module.exports = router;
<!DOCTYPE html>
<html>
  <head>
    <title><%= title %></title>
    <link rel='stylesheet' href='/stylesheets/style.css' />
  </head>
  <body>
    <h1><%= title %></h1>
    <p>Welcome to <%= title %></p>
    <section id="poems"> <%= message %> </section>
  </body>
</html>
<h1><%= message %></h1>
<h2><%= error.status %></h2>
<pre><%= error.stack %></pre>
routes/index.js

var errorhandler = require('errorhandler');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');

var indexRouter = require('./routes/index');
var poemsRouter = require('./routes/poems')

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use(errorhandler());

app.use('/', indexRouter);
app.use('/poems', poemsRouter);

// error handler
app.use(function(err, req, res, next) {
  res.locals.message = err.message
  if (process.env.NODE_ENV === 'development') {
    // only use in development
    res.locals.error = err;
  }
  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

module.exports = app;
var express = require('express');
var router = express.Router();
const poem = require('../public/javascripts/poem')

/* GET poems list page. */
router.get('/', async function(req, res, next) {
  await poem.allPoems((allPoems) => {
    res.render('poems', { message: allPoems });
  });
});

/* GET add poem page. */
router.get('/new', function(req, res, next) {
  let content = req.body;
  console.log(content)
  res.render('addPoem', { message: content });
});

/* Add a new poem. */
router.post('/new'), function(req, res, next) {
  const message = req.body.content // not sure if this is even correct
  console.log(message)
 
  res.render('poems') // something like res.render('poems', { message: I_should_put_a_correct_vaiarable_name_here }) should probably happen here
}

module.exports = router;
<!DOCTYPE html>
<html>
  <head>
    <link rel='stylesheet' href='../public/stylesheets/style.css' />
  </head>
  <body>
    <ul>
      <!-- <%= message %> -->
      <%message.forEach(poem => {%>
      <li><%= poem.content %></li>
      <% }) %>
    </ul>
  </body>
</html>
<!DOCTYPE HTML>
<HTML>
  <head>
    <link rel='stylesheet' href='/stylesheets/style.css' />
 </head>
 <body>
    <form action="/poems/new" method="post">
      <!-- <%= message %> -->
      <label for="content"><%=message.content%></label>
      <input type="text" id="content" name="content" value="<%=   message.content %>">
      <button type="submit" value="add poem">add poem</button>
    </form>
  </body>
</html>
var express = require('express');
var router = express.Router();

/* GET home page. */
router.get('/', function(req, res, next) {
  res.render('index', { 
    title: 'Poems',
    message: 'Here you\'ll see poems' });
});

module.exports = router;
<!DOCTYPE html>
<html>
  <head>
    <title><%= title %></title>
    <link rel='stylesheet' href='/stylesheets/style.css' />
  </head>
  <body>
    <h1><%= title %></h1>
    <p>Welcome to <%= title %></p>
    <section id="poems"> <%= message %> </section>
  </body>
</html>
<h1><%= message %></h1>
<h2><%= error.status %></h2>
<pre><%= error.stack %></pre>
视图/索引.ejs

var errorhandler = require('errorhandler');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');

var indexRouter = require('./routes/index');
var poemsRouter = require('./routes/poems')

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use(errorhandler());

app.use('/', indexRouter);
app.use('/poems', poemsRouter);

// error handler
app.use(function(err, req, res, next) {
  res.locals.message = err.message
  if (process.env.NODE_ENV === 'development') {
    // only use in development
    res.locals.error = err;
  }
  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

module.exports = app;
var express = require('express');
var router = express.Router();
const poem = require('../public/javascripts/poem')

/* GET poems list page. */
router.get('/', async function(req, res, next) {
  await poem.allPoems((allPoems) => {
    res.render('poems', { message: allPoems });
  });
});

/* GET add poem page. */
router.get('/new', function(req, res, next) {
  let content = req.body;
  console.log(content)
  res.render('addPoem', { message: content });
});

/* Add a new poem. */
router.post('/new'), function(req, res, next) {
  const message = req.body.content // not sure if this is even correct
  console.log(message)
 
  res.render('poems') // something like res.render('poems', { message: I_should_put_a_correct_vaiarable_name_here }) should probably happen here
}

module.exports = router;
<!DOCTYPE html>
<html>
  <head>
    <link rel='stylesheet' href='../public/stylesheets/style.css' />
  </head>
  <body>
    <ul>
      <!-- <%= message %> -->
      <%message.forEach(poem => {%>
      <li><%= poem.content %></li>
      <% }) %>
    </ul>
  </body>
</html>
<!DOCTYPE HTML>
<HTML>
  <head>
    <link rel='stylesheet' href='/stylesheets/style.css' />
 </head>
 <body>
    <form action="/poems/new" method="post">
      <!-- <%= message %> -->
      <label for="content"><%=message.content%></label>
      <input type="text" id="content" name="content" value="<%=   message.content %>">
      <button type="submit" value="add poem">add poem</button>
    </form>
  </body>
</html>
var express = require('express');
var router = express.Router();

/* GET home page. */
router.get('/', function(req, res, next) {
  res.render('index', { 
    title: 'Poems',
    message: 'Here you\'ll see poems' });
});

module.exports = router;
<!DOCTYPE html>
<html>
  <head>
    <title><%= title %></title>
    <link rel='stylesheet' href='/stylesheets/style.css' />
  </head>
  <body>
    <h1><%= title %></h1>
    <p>Welcome to <%= title %></p>
    <section id="poems"> <%= message %> </section>
  </body>
</html>
<h1><%= message %></h1>
<h2><%= error.status %></h2>
<pre><%= error.stack %></pre>

我现在正在学习快车。如果有什么遗漏,你想让我补充一下,请告诉我。另外,如果我在网上添加一个链接到我的项目,我不知道它是如何工作的。接受建议。非常感谢。

您是否为indexRouter设置了catchall 404路由处理程序?我没有。我已经从npm安装了
errorhandler
,但是如果我安装正确,我没有正确使用它?我不熟悉这个软件包,但它似乎没有涵盖404未找到的错误类型。你能把你的indexRouter文件的代码粘贴到你的帖子里吗?没错。这也是我想关注的另一个问题。我刚刚粘贴了indexRouter文件和相关的
index.ejs
文件(加上
error.ejs
文件。-不确定是否需要最后一个文件)好的,您在这里过早地关闭了括号:router.post(“/new”)。应该是:router.post('/new',function(req,res,next){/..whatever})。看起来可能还有其他问题,包括在poem.ejs文件中,但我让您看看。