快速服务器-不能POST /

Express Server - Cannot POST /

本文关键字:POST 不能 服务器      更新时间:2023-09-26

我最近学习了一个关于如何构建Express服务器的简单教程(https://codeforgeek.com/2014/06/express-nodejs-tutorial/)。

我正试图从本教程扩展代码,以便我可以响应post请求。我想通过更新一个json文件来做到这一点(它恰好充满了'用户评论',然后在'/'

重新渲染

。/server.js:

var express = require('express');
var app = express();
// routing configuration
require('./router/main')(app);
// ejs configuration
app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');
app.engine('html', require('ejs').renderFile);
// run the server
var server = app.listen(8080, function(){
  console.log('Express server listening on port 8080');
});

。/路由器/main.js(路由器):

var fs = require('fs');
var ejs = require('ejs')
module.exports = function(app){
  app.get('/', function(req, res){
    var comments = JSON.parse(fs.readFileSync(__dirname + '/../comments.json'));
    res.render('index.ejs', comments);
  });
  app.post('/', function(req, res){
    console.log('here in post');
    var name = req.body.name;
    var message = req.body.message;
    var newComment = {"name": name, "message": message};
    var comments = JSON.parse(fs.readFileSync(__dirname + '/../comments.json'));
    comments.push(newComment);
    fs.writeFileSync(__dirname + '/../comments.json', comments, 'utf8');
    //redirect to a 'get' on '/'
    res.redirect('/');
  });
  app.get('/about', function(req, res){
    res.render('about.html')
  });
}

。/视图/index.ejs:

<div>
  <div>
    <h1> Joe's Forum </h1>
    <a href='/about'> (about) </a>
  </div>
  <div>
    <ul>
    <% comments.forEach( function(comment){ %>
      <li>
        <%= comment.name %> : <%= comment.message %>
      </li>
    <% }); %>
    </ul>
  </div>
  <h2> Enter a new comment </h2>
  <form action='/' method="post">
    Enter your name: <input type='text' name='name'> <br><br>
    Enter your message: <input type='textarea' name='message'> <br><br>
    <input type='submit' value='Submit'>
  <form>
</div>

。/comments.json:

{
  "comments": [
    {"name":"Joe", "message" : "What advantages does Node.js afford the web developer?"},
    {"name": "John", "message": "Asynchronous IO helps us to keep our pages responsive even if the server is fetching data"}
  ]
}

当我尝试从我的表单提交一个新的评论时,我所看到的是:

"Cannot POST/"

谁能解释一下为什么我可能会得到这个错误?由于

实际上有几个问题,但主要问题是您没有正文解析器-将POST中的节点流转换为req.body的模块。我目前只熟悉bodyParser,你可能应该研究一下。虽然它显示在Express 4中。当您运行该服务器时,您会得到一条弃用消息。

另一个问题是comments.push的问题。应该是comments.comments.push。以下作品:

router.js:

var fs = require('fs');
var ejs = require('ejs')
module.exports = function(app){
  app.get('/', function(req, res){
    var comments = JSON.parse(fs.readFileSync(__dirname + '/../comments.json'));
    res.render('index.ejs', comments);
  });
  app.post('/', function(req, res){
    console.log('here in post');
    console.log(req.body)
    var name = req.body.name;
    var message = req.body.message;
    var newComment = {"name": name, "message": message};
    var comments = JSON.parse(fs.readFileSync(__dirname + '/../comments.json'));
    comments.comments.push(newComment);
    fs.writeFileSync(__dirname + '/../comments.json', JSON.stringify(comments), 'utf8');
    //redirect to a 'get' on '/'
    res.redirect('/');
  });
  app.get('/about', function(req, res){
    res.render('about.html')
  });
}

和server.js:

var express = require('express');
var bodyParser = require('body-parser');
var app = express();
app.use(bodyParser.urlencoded())
// routing configuration
require('./router/main')(app);
// ejs configuration
app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');
app.engine('html', require('ejs').renderFile);
// run the server
var server = app.listen(8080, function(){
  console.log('Express server listening on port 8080');
})