Expressjs rest api 如何处理链接功能
Expressjs rest api how to deal with chaining functionality
我正在使用 express、mongoose 和 mongodb 构建一个 restful API。它工作得很好,但我有一个问题,关于如何处理包含更多功能的请求,而不仅仅是在数据库中查找、删除或更新。我的用户模型如下所示:
var UserSchema = new Schema({
emailaddress: {type: String, unique: true},
firstname: String,
lastname: String,
password: String,
friends: [{type: Schema.Types.ObjectId, unique: true}]
});
如您所见,朋友数组只是一个 ObjectId 数组。这些 ObjectIds 引用数据库中的特定用户。如果我想检索用户的朋友数组,我现在必须查找发出请求的用户,然后找到与朋友数组中具有相同 ID 的所有用户。
现在看起来像这样:
methods.get_friends = function(req, res) {
//find user.
User.findOne({_id: req.params.id}, function(err, user, next) {
if(err) next(err);
if(user) {
console.log(user);
//find friends
User.find({_id: {$in: user.friends}}, {password: 0}).exec(function (err,
friends, next) {
if(err) next(err);
if(friends) {
res.send(friends);
};
});
}
可不可以将用户的查找分离到某个方法中,然后串联起来?我看到了一些关于中间件链接的信息,即 app.get('/friends', getUser, getFriend)
,但这是否意味着我必须在我的中间件 (getUser) 方法中更改 req 对象然后将其传递?你会如何解决这个问题?您是否可以更改 mongoose 模型并保存所有朋友数据(意味着它可能会过时),或者您是否会创建一个方法 getUser 来 returns 您将收集朋友数据的承诺?
如果能得到所有帮助,我将不胜感激!
提前致谢。
Mongoose 有一个名为 population 的功能,可以在这些情况下提供帮助。基本上,Mongoose 将执行从数据库加载 friends
文档所需的额外 query/queries:
User.findOne({_id: req.params.id})
.populate('friends')
.exec(function(err, user) {
...
});
这会将所有相关朋友加载到 user.friends
(作为数组)。
如果您想添加额外的约束(在您的示例中,password : 0
),您也可以这样做:
User.findOne({_id: req.params.id})
.populate({
path : 'friends'
match : { password : 0 },
})
.exec(function(err, user) {
...
});
我正在使用 express、mongoose 和 mongodb 构建一个 restful API。它工作得很好,但我有一个问题,关于如何处理包含更多功能的请求,而不仅仅是在数据库中查找、删除或更新。我的用户模型如下所示:
var UserSchema = new Schema({
emailaddress: {type: String, unique: true},
firstname: String,
lastname: String,
password: String,
friends: [{type: Schema.Types.ObjectId, unique: true}]
});
如您所见,朋友数组只是一个 ObjectId 数组。这些 ObjectIds 引用数据库中的特定用户。如果我想检索用户的朋友数组,我现在必须查找发出请求的用户,然后找到与朋友数组中具有相同 ID 的所有用户。
现在看起来像这样:
methods.get_friends = function(req, res) {
//find user.
User.findOne({_id: req.params.id}, function(err, user, next) {
if(err) next(err);
if(user) {
console.log(user);
//find friends
User.find({_id: {$in: user.friends}}, {password: 0}).exec(function (err,
friends, next) {
if(err) next(err);
if(friends) {
res.send(friends);
};
});
}
可不可以将用户的查找分离到某个方法中,然后串联起来?我看到了一些关于中间件链接的信息,即 app.get('/friends', getUser, getFriend)
,但这是否意味着我必须在我的中间件 (getUser) 方法中更改 req 对象然后将其传递?你会如何解决这个问题?您是否可以更改 mongoose 模型并保存所有朋友数据(意味着它可能会过时),或者您是否会创建一个方法 getUser 来 returns 您将收集朋友数据的承诺?
如果能得到所有帮助,我将不胜感激!
提前致谢。
Mongoose 有一个名为 population 的功能,可以在这些情况下提供帮助。基本上,Mongoose 将执行从数据库加载 friends
文档所需的额外 query/queries:
User.findOne({_id: req.params.id})
.populate('friends')
.exec(function(err, user) {
...
});
这会将所有相关朋友加载到 user.friends
(作为数组)。
如果您想添加额外的约束(在您的示例中,password : 0
),您也可以这样做:
User.findOne({_id: req.params.id})
.populate({
path : 'friends'
match : { password : 0 },
})
.exec(function(err, user) {
...
});