2015-09-23 12 views
6

Son zamanlarda bir Express sunucusunun (https://codeforgeek.com/2014/06/express-nodejs-tutorial/) nasıl oluşturulacağı hakkında basit bir eğitici takip ettim.Hızlı Sunucu - POST/

Bu eğiticiden kodu genişletmeye çalışıyorum, böylece isteklere yanıt verebilirim. Bir json dosyasını güncelleyerek bunu yapmak istiyor (yani 'kullanıcı yorumları' ile doldurulacak olur ve sonra '/'

./server.js de yeniden işlenmesinden:

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 (router):

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:

"Can not POST /"

:

{ 
    "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"} 
    ] 
} 

benim formdan yeni bir yorum göndermeyi deneyin, tek gördüğüm şudur

Birisi bu hatayı neden aldığımı açıklayabilir mi? Teşekkürler

+0

. Asla noSJ'nin 'Sync' api'sini kullanmamalısınız ve kesinlikle bir ekspres sunucudan yanıt almamalısınız. Ayrıca, herhangi bir yeri kontrol etmekte hata yok, dolayısıyla sunucunuz çok düşmesine neden olacak. 'Comments.json'un içeriğini gösterebilir misin? – caasjj

+0

Yeterince adil. Bununla birlikte, sadece eğilerek Express'te bir egzersiz olarak 'çalışmasını' istedim. Bunun harika bir kod olmadığını biliyorum. 'İstek isteği' çalışmasını aldıktan sonra, bunu temizlemeyi (yani, en iyi uygulamalara abone olmayı) planlıyorum. İstenirse, comments.json içerecek şekilde düzenleyeceğim. –

+0

Hepsi eleştiri olarak değil - sadece farkında olabileceğiniz ya da bilmediğiniz bir şeye işaret ediyor. Şimdi, sanırım kodunuzun neden hatalı olduğunu anlıyorum. Bir "Array" yerine "object" üzerinde "comments.push" yapıyorsunuz. Size açık bir cevap verebilecek miyim? – caasjj

cevap

3

Aslında bir çift sorun var, ancak ana çözümleyici, POST'ta bir düğüm akışını req.body'a dönüştüren modül. Şu anda sadece bodyParser ile aşina oldum ve muhtemelen biraz araştırmalısın. Express 4.x belgelerinde gösterilmesine rağmen, sunucuyu çalıştırdığınızda bir kullanımdan kaldırma iletisi alırsınız.

Diğer bir problem de comments.push numaralı konudur. Bu comments.comments.push olmalıdır. Aşağıdaki işler:

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

} 

ve server.js: Gerçek hayır-hayır bir şey yapıyoruz

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

Cevabınız için teşekkürler. Bir kez 15 itibarı aldığımda, bunu tekrarlayacağım. –

+0

Bunu takdir et!Lütfen genel olarak vücut ayrıştırma ve ara katman yazılımı konusuna bakın, çünkü bu Express'in nasıl çalıştığına dair çok öğretici olacaktır. – caasjj