我正在开发一个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]);
}
})
//}
});
}
答案 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的方式,而不是因为您的代码。