在express中访问req.body值

时间:2017-03-16 18:19:05

标签: json node.js mongodb express post

我正在开发一个REST API节点/ express应用程序。对于我的'注册'路由,用户使用api注册服务,它需要一个POST的JSON对象。在这个函数中我想检查mongo db以确保该用户不存在。

问题是我需要从发布的json信息中获取用户名,但我所做的每一次尝试都失败了。尝试记录req.body.username和req.body.password的行始终返回'undefined'。我做错了什么?

以下是我到目前为止的代码:

exports.signup = function(req, res) {

  // todo: somehow verify that username, password, email and phone number are all provided.
  // do not write into the collection unless we know all the information has been provided.
  // maybe access the JSON elements to make sure they are not null
  // todo: also make sure a record doesn't already exist for this uer

  var user = req.body;

  // need to get the username here somehow
  var JSONuser = JSON.stringify(user);
 // console.log('user: ' + user);
  console.log('userJSON: ' + JSON.stringify(user));
  console.log('username: ' + req.body.username);
  console.log('password: ' + req.body.password);

  db.collection('users', function(err, collection){
    //if ( collection.findOne({}) ) { // make sure the user doesn't already exist here
        collection.insert(user, {safe:true}, function(err, result){
          if(err){
            res.send({'error':'An error has occured'});
          } else {
            console.log('Success: ' + JSON.stringify(result[0]));
            res.send(result[0]);
          }
        })
    //}
  });
}

1 个答案:

答案 0 :(得分:0)

默认情况下,您不能通过点语法访问这些变量。您必须解析响应。幸运的是,我们有一个包装。

使用body-parser中间件轻松访问发布变量。

// install it
bash$: npm install body-parser    

// require it in your project
bodyParser = require('body-parser');

// `use` it in your express app
app.use(bodyParser.urlencoded({ extended: true}));

// now you your post values are available on the req.body.postVariableName

我几乎在所有项目中使用它,它只是简单易用。

*编辑*

我查看了你的回购,一切看起来都很好,因为它与读取的解析值有关;但是,他们的方式console logging他们可能会让你感到困惑。我改写了你的登录路线,所以我可以更好地解释。

exports.signin = function(req, res) {

    var user = req.body;
    console.log('req.body: ' + JSON.stringify(user));
    console.log('Signing In As User: ' + user.username);
    console.log('Password: ' + user.password);
    res.send('You just signed in!');

}

我测试了这个我打开另一个终端并卷曲JSON帖子。

curl -H "Content-Type: application/json" -X POST -d '{"username":"testuser","password":"testpassword"}' http://localhost:3000/signin

你可以看到它应该有效。

有些事情值得一提。当你写console.log('req.body: ' + req.body);时。您不会看到您想要的数据。您将在输出中看到req.body: [object],因为javascript将把它呈现为req.body.toString(),它只是标识符。如果您要发布代码,请使用JSON.stringify(req.body)或使用console.dir(req.body)

其次,req.body只会让你访问身体对象。

// this is just user.toString() which is again [object]
console.log('Signing In As User: ' + user);

// You need to use the dot syntax to get user.username
console.log('Signing In As: " + user.username);

如果您仍在查看问题,那是因为您发布localhost的方式,而不是因为您的代码。