我想在nodejs应用程序中获取数据,如下所述 user.js,userProfile是mongoose的模型。
user.js的
var userSchema = new Schema({
nick_name:{type:String},
email: {type: String},
password: {type: String},
is_active:{type:String,enum:['1','0'],default:"1"},
},{ collection: 'user'});
userProfile.js
var userProfileSchema = new Schema({
user_id:{type:Schema.Types.ObjectId, ref:'User'},
first_name:{type:String},
last_name:{type:String},
address:{type:String},
country:{type:String},
state:{type:String},
city:{type:String},
gender:{type:String,enum:['m','f','o'],default:"m"},
is_active:{type:String,enum:['1','0'],default:"1"},
},{ collection: 'userProfile'});
想按照以下方式退出
{
"nick_name" : "laxman",
"email" : "laxman@mailinator.com",
"first_name" : "my first name",
"last_name" : "my last name",
"address" : "my address",
"country" : "my country",
"state" : "my state",
"city" : "my city",
"gender" : "m",
}
依赖关系
"express" => "version": "4.7.4",
"mongoose" => "version": "4.4.5",
"mongodb" => "version": "2.4.9",
"OS" => "ubuntu 14.04 lts 32bit",
SQL查询供参考
SELECT * FROM `user`
left join `user_profile`
on user.id =user_profile.user_id
WHERE 1
答案 0 :(得分:0)
这个问题的答案取决于你如何进行身份验证,但我会回答这个问题,我将如何实现你的要求。
首先,我会制作一个Schema而不是两个单独的Schema。然后,取决于您的身份验证方法,我使用令牌,您将把数据传递给客户端接收的任何数据。它还有助于了解您是否在客户端使用处理HTTP请求的任何内容,或者这只是一个节点应用程序。
我将尝试详细介绍这两种方法。
假设您正在使用Cookie,我将假设您知道如何使用Express建立会话,或者您在节点之上使用的任何框架,以及假设您知道自己是什么尽可能正确地保护您的密码并直接跳到api大楼。
假设这是服务器端的控制器,用于在登录时对用户进行身份验证。
var User = mongoose.model('User');
exports.login = function (req, res) {
User.findOne({email: req.body.email), function (err, user) {
if (err) {
return res.json(err);
} else if (!user) {
return res.json({message: 'User not found.'});
} else {
if (req.body.password === user.password) {
req.session.user = user;
} else {
return res.json({message: 'Invalid username or password.'});
}
}
)};
};
当然,您要确保设置了一些中间件,因此密码绝对不会随用户一起发送,但这不是问题所在。
一旦你有了,那么你需要用户数据的任何其他路线都相当简单。你制作另一个控制器:
exports.profile = function (req, res) {
if (req.session && req.session.user) {
User.findOne({email: req.session.user.email}, function (err, user) {
if (!user) {
res.session.reset();
res.redirect('/login');
} else {
res.locals.user = user;
res.render('/profile);
}
)};
}
};
我在服务器端进行了渲染,但是如果你使用像Angular这样的东西,你可以把它拉到客户端。
如果您使用的是我强烈推荐的令牌,那么该方法非常相似。我也很乐意解释其中的一些内容。