2015-09-23 5 views
6

Недавно я проследил простой учебник по созданию сервера 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'); 
}); 

. /router/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') 
    }); 

} 

./views/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"} 
    ] 
} 

Когда я пытаюсь представить новый комментарий от моей формы, я вижу это:

"Может не POST /"

Может кто-нибудь объяснить, почему я могу получить эту ошибку? Спасибо

+0

Вы делаете что-то реальное нет-нет. Вы никогда не должны использовать 'Sync' api nodeJS и, конечно, не отвечать на экспресс-сервер. Там также нет ошибок в любом месте, поэтому ваш сервер будет очень подвержен сбою. Можете ли вы показать содержимое 'comments.json'? – caasjj

+0

Хорошо справедливо. Тем не менее, я просто хотел «заставить его работать» как упражнение в склонности Express. Я знаю, что это не отличный код. Как только я получу «почтовый запрос», я намерен его очистить (т. Е. Подписаться на лучшие практики). В соответствии с просьбой я отредактирую, чтобы включить comments.json. –

+0

Ни в коем случае не означало критики - просто указывая на то, что вы могли бы или не могли бы знать. Теперь, я думаю, я также понимаю, почему ваш код плохо себя ведет. Вы делаете 'comments.push' в' Object', а не в 'Array'. Позвольте мне посмотреть, могу ли я разрешить вам четкий ответ. – caasjj

ответ

3

На самом деле существует пара проблем, но главная из них заключается в том, что у вас нет синтаксического анализатора тела - модуля, который преобразует поток узлов в POST в req.body. Я в настоящее время знаком только с bodyParser, и вам, вероятно, следует немного подумать об этом. Хотя это показано в документации Express 4.x, вы получаете сообщение об отказе при запуске сервера.

Другая проблема заключается в проблеме 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'); 
}) 
+0

Спасибо за ваш ответ. Как только я получу 15 репутацию, я буду ее продвигать. –

+0

Цените это!Пожалуйста, изучите вопрос о разборе тела и промежуточном программном обеспечении в целом, поскольку это будет очень поучительно в том, как работает Express. – caasjj

Смежные вопросы