将 ref 保存到用户登录
Saving ref to a User login
我在编写简单的用户和推文架构关系时遇到了麻烦。
我创建了一个中间件,一旦他登录就会检查用户令牌。这是一个基于令牌的身份验证。问题在于如何将推文保存到登录用户的“/tweet”路由部分。
schema.js
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var UserSchema = new Schema({
name: String,
username: { type: String, required: true, index: { unique: true }},
password: { type: String, required: true, select: false },
level: String,
tweet: [{
type: Schema.Types.ObjectId, ref: 'Tweet'
}],
});
var TweetSchema = new Schema({
_creator: { type: Number, ref: 'User'},
title: String,
content: String
});
module.exports = mongoose.model('User', UserSchema);
module.exports = mongoose.model('Tweet', TweetSchema);
api.js
假设我已经编写了用于登录用户的“/login”路由,并在此中间件之上创建了一个令牌。
// The middleware for verifying user's token ( The user already login )
apiRouter.use(function(req, res, next) {
// do logging
console.log("Somebody just came to our app!");
var token = req.body.token || req.param('token') || req.headers['x-access-token'];
// check if token exist
if(token) {
jwt.verify(token, superSecret, function(err, decoded) {
if(err) {
res.status(403).send({ success: false, message: 'Failed to authenticate user' });
} else {
// if everything is good save request for use in other routes
req.decoded = decoded;
next();
}
});
} else {
res.status(403).send({ success: false, message: 'No token provided' });
}
});
// another route for creating a tweet, in order to use this route, user's token must be verified.
apiRouter.route('/tweet')
.post(function(req, res) {
// The problem is I dont know how to get a user that just Login to create a tweet that will save in his user_tweet Schema.
var tweet = new Tweet({
_creator: ???,
title: req.body.title,
content: req.body.content
});
tweet.save(function(err) {
if(err) res.send(err);
res.json({ message: "New tweet has been added" });
});
});
目前,我在创建推文并将其保存到已登录且令牌已验证的用户时遇到了问题。我应该在“/tweet”路线部分写什么来实现我的目标。
我正在尝试为你们的信息模拟 Twitter 应用程序。
我不知道您使用什么来生成令牌,但标准做法是将用户 ID 编码为令牌的一部分。因此,当您解码令牌时,就像您在此处所做的那样:
req.decoded = 已解码;
req.decoded 它应该包含用户 ID,然后您可以使用它来查找用户并检查他们的权限,或者在您的情况下,您将使用它来创建推文对象。
所以像这样:
// create a json webtoken
var token = jwt.sign({
id = user._id,
name: user.name,
username: user.username
}, superSecret, {
expiresInMinute: 1440
});
然后做:
var tweet = new Tweet({
_creator: req.decoded.id,
title: req.body.title,
content: req.body.content
});
我在编写简单的用户和推文架构关系时遇到了麻烦。 我创建了一个中间件,一旦他登录就会检查用户令牌。这是一个基于令牌的身份验证。问题在于如何将推文保存到登录用户的“/tweet”路由部分。
schema.js
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var UserSchema = new Schema({
name: String,
username: { type: String, required: true, index: { unique: true }},
password: { type: String, required: true, select: false },
level: String,
tweet: [{
type: Schema.Types.ObjectId, ref: 'Tweet'
}],
});
var TweetSchema = new Schema({
_creator: { type: Number, ref: 'User'},
title: String,
content: String
});
module.exports = mongoose.model('User', UserSchema);
module.exports = mongoose.model('Tweet', TweetSchema);
api.js
假设我已经编写了用于登录用户的“/login”路由,并在此中间件之上创建了一个令牌。
// The middleware for verifying user's token ( The user already login )
apiRouter.use(function(req, res, next) {
// do logging
console.log("Somebody just came to our app!");
var token = req.body.token || req.param('token') || req.headers['x-access-token'];
// check if token exist
if(token) {
jwt.verify(token, superSecret, function(err, decoded) {
if(err) {
res.status(403).send({ success: false, message: 'Failed to authenticate user' });
} else {
// if everything is good save request for use in other routes
req.decoded = decoded;
next();
}
});
} else {
res.status(403).send({ success: false, message: 'No token provided' });
}
});
// another route for creating a tweet, in order to use this route, user's token must be verified.
apiRouter.route('/tweet')
.post(function(req, res) {
// The problem is I dont know how to get a user that just Login to create a tweet that will save in his user_tweet Schema.
var tweet = new Tweet({
_creator: ???,
title: req.body.title,
content: req.body.content
});
tweet.save(function(err) {
if(err) res.send(err);
res.json({ message: "New tweet has been added" });
});
});
目前,我在创建推文并将其保存到已登录且令牌已验证的用户时遇到了问题。我应该在“/tweet”路线部分写什么来实现我的目标。
我正在尝试为你们的信息模拟 Twitter 应用程序。
我不知道您使用什么来生成令牌,但标准做法是将用户 ID 编码为令牌的一部分。因此,当您解码令牌时,就像您在此处所做的那样:
req.decoded = 已解码;
req.decoded 它应该包含用户 ID,然后您可以使用它来查找用户并检查他们的权限,或者在您的情况下,您将使用它来创建推文对象。
所以像这样:
// create a json webtoken
var token = jwt.sign({
id = user._id,
name: user.name,
username: user.username
}, superSecret, {
expiresInMinute: 1440
});
然后做:
var tweet = new Tweet({
_creator: req.decoded.id,
title: req.body.title,
content: req.body.content
});