nodejs POST请求未发布到db并返回302响应

时间:2017-03-04 18:23:02

标签: javascript node.js mongodb express

我一直在使用node.js,express,mongodb中的基本CRUD应用程序并使用教程我尝试自行设置它。我不确定为什么我的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响应。我真的很困惑我应该在哪里寻找我的错误。我的表单操作设置为/ users,路由器使用(/ users)用户控制器和路由。

以下是表格:

<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>

任何帮助都是指定的,并为间距道歉!

3 个答案:

答案 0 :(得分:1)

 res.redirect("/users");

执行此操作时,它将返回302状态代码。像上面的get请求中那样使用res.render来获得200回。

答案 1 :(得分:1)

不确定您的app应用程序的中间件是否已有此功能,但您可以尝试使用 body-parser 中间件来解析 application / x-www-form-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 }));
...

答案 2 :(得分:0)

如果您想重定向而不是呈现,只需删除普通res.format()的{​​{1}}。以你的方式在他们之间混合将永远不会奏效。

<强>替换

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