2017-03-04 45 views
0

我一直在研究node.js中的基本CRUD應用程序,express,mongodb和使用教程嘗試自行設置它。我不確定爲什麼我在POST請求中收到302響應。nodejs POST請求不張貼到數據庫並返回302響應

router.route('/') 
    .get(function(req, res, next) { 
    mongoose.model('User').find({}, function(err, users) { 
     if (err) { 
      return console.error(err); 
     } else { 
      res.format({ 
       html: function() { 
        res.render('users/index', { 
         title: 'All Users', 
         "users": users 
        }); 
       }, 
       json: function() { 
        res.json(users); 
       } 
      }); 
     } 
    }); 
}) 
.post(function(req,res) { 
    // get values from post request 
    var name = req.body.name; 
    var iscool = req.body.iscool; 
    // call the create function from mongoose 
    mongoose.model('User').create({ 
     name: name, 
     iscool: iscool 
    }, function(err, user) { 
     if (err) { 
      res.send("There was a problem connecting to db"); 
     } else { 
      console.log(res.statusCode); 
      console.log('Creating POST for ' + user.name); 
      res.format({ 
       html: function() { 
        // if successful, set header address bar to "users" 
        res.location("users"); 
        res.redirect("/users"); 
       }, 
       json: function() { 
        res.json(user); 
       } 
      }); 
     } 
    }) 
}); 

哪裏CONSOLE.LOG(res.statusCode)它返回一個200 OK應答,但在我的Chrome瀏覽器開發工具我得到我的網絡請求302響應。我只是很困惑,我應該在哪裏尋找我的錯誤。我的表單的操作設置爲/用戶和路由器使用(/用戶)爲用戶控制器和路線。

這裏是形式以及:

<form name="adduser" action="/users" method="post"> 
<div> 
    <label for="name">Name:</label> 
    <input type="text" id="name" name="name"> 
</div> 
<div> 
    <label for="iscool">Are you cool?</label> 
    <input type="checkbox" value="true" name="iscool"> 
<div> 
<div> 
    <button type="submit">Submit</button> 
</div> 

任何幫助appeciated和間距的歉意!

+0

嗨,你可能需要使用快遞_method-override_和_body-parser_,還設置_enctype_到窗體: '<形式方法= 「POST」 行動=「/ users」enctype =「application/x-www-form-urlencoded」>' –

+0

@ ricardo-fornes so _method-override_ needed?我從教程中故意拿出來,因爲我不認爲這是必要的。 –

+0

是的,_method-override_中間件不是必須的,只有當你想使用DELETE&PUT(在某些瀏覽器中不支持)方法時才需要 –

回答

1

不知道,如果你已經有這個您應用的中間件,但你可以嘗試使用體解析器中間件解析應用程序/ x-WWW窗體-urlencoded

在你的終端:

npm install --save body-parser 

您的形式:

... 
<form method="POST" action="/users" enctype="application/x-www-form-urlencoded"> 
... 

然後在您的應用程序:

... 
var bodyParser = require('body-parser'); 
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({ extended: true })); 
... 
1
res.redirect("/users"); 

當你這樣做,它會返回一個302狀態碼。使用res.render就像你在GET請求沒有上面獲得200回。

+0

我很感謝你的回覆,我想在任何事情之前,沒有任何東西會被髮送到我的數據庫因爲某些原因。此外,res.render顯示/ users正在顯示沒有數據的事件,而/ users /則顯示來自ejs文件的數據。你看到我的代碼出了什麼問題? –

+0

@DannyKim這是因爲你的'/用戶'請求沒有POST處理程序。 你應該刪除'.post(function ...)'並將其添加到'/ users'路徑中。像這樣: 'router.route('/ users')。post(function(req,res){...}) 正如你所見,你目前的'.post'處理程序位於根路由'/' – ellimist

0

,如果你想重定向,而不是渲染只是刪除res.format()與正常res.redirect()。用你的方式在它們之間混合將永遠不會工作。

替換:

res.format({ 
    html: function() { 
     // if successful, set header address bar to "users" 
     res.location("users"); 
     res.redirect("/users"); 
    }, 
    json: function() { 
     res.json(user); 
    } 
}); 

有了:

res.redirect("/users"); 
相關問題