Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 基于GET参数的Express/Mongoose REST API路由_Node.js_Rest_Express_Mongoose - Fatal编程技术网

Node.js 基于GET参数的Express/Mongoose REST API路由

Node.js 基于GET参数的Express/Mongoose REST API路由,node.js,rest,express,mongoose,Node.js,Rest,Express,Mongoose,在使用Mongo+Express设计restapi时,我试图了解如何处理更复杂的查询。不幸的是,我能找到的所有例子都太简单了。为了回答这个问题,这里有一个简单的例子。我有组和用户。每个小组有成员和一名组长。为了简单起见,我将排除中间件和post/put/delete功能 路线看起来像这样: app.get('/groups', groups.all); app.get('/groups/:groupId', groups.show); app.param('groupId', group

在使用Mongo+Express设计restapi时,我试图了解如何处理更复杂的查询。不幸的是,我能找到的所有例子都太简单了。为了回答这个问题,这里有一个简单的例子。我有组和用户。每个小组有成员和一名组长。为了简单起见,我将排除中间件和post/put/delete功能

路线看起来像这样:

app.get('/groups', groups.all);  
app.get('/groups/:groupId', groups.show);  
app.param('groupId', groups.group); 
/**
* Module dependencies.
*/
var mongoose = require('mongoose'),
   Group = mongoose.model('Group'), 
   _ = require('lodash');


/**
* Find group by id
*/
exports.group = function(req, res, next, id) {
    Group.load(id, function(err, group) {
       if (err) return next(err);
       if (!group) return next(new Error('Failed to load group ' + id));
       req.group = group;
       next();
    });
};

/**
* Show a group
*/
exports.show = function(req, res) {
   res.jsonp(req.group);
};

/**
* List of Groups
*/
exports.all = function(req, res) {
   Group.find().sort('-created').populate('user', 'name username').exec(function(err, groups) {
    if (err) {
        res.render('error', {
            status: 500
        });
    } else {
        res.jsonp(groups);
    }
   });
};
控制器的外观如下所示:

app.get('/groups', groups.all);  
app.get('/groups/:groupId', groups.show);  
app.param('groupId', groups.group); 
/**
* Module dependencies.
*/
var mongoose = require('mongoose'),
   Group = mongoose.model('Group'), 
   _ = require('lodash');


/**
* Find group by id
*/
exports.group = function(req, res, next, id) {
    Group.load(id, function(err, group) {
       if (err) return next(err);
       if (!group) return next(new Error('Failed to load group ' + id));
       req.group = group;
       next();
    });
};

/**
* Show a group
*/
exports.show = function(req, res) {
   res.jsonp(req.group);
};

/**
* List of Groups
*/
exports.all = function(req, res) {
   Group.find().sort('-created').populate('user', 'name username').exec(function(err, groups) {
    if (err) {
        res.render('error', {
            status: 500
        });
    } else {
        res.jsonp(groups);
    }
   });
};
然后模型会像这样:

var mongoose = require('mongoose'),
Schema = mongoose.Schema;

/**
* Group Schema
*/
var GroupSchema = new Schema({
   created: {
       type: Date,
       default: Date.now
   },
   updated: {
       type: Date,
       default: Date.now
   },
   enableScores: {
       type: Boolean,
       default: false
   },
   name: {
       type: String,
       default: '',
       trim: true
   },
   creator: {
       type: Schema.ObjectId,
       ref: 'User'
   },
   commissioner: {
       type: Schema.ObjectId,
       ref: 'User'
   }
});

/**
* Validations
*/
GroupSchema.path('name').validate(function(name) {
   return name.length;
}, 'Name cannot be blank');

/**
* Statics
*/
GroupSchema.statics.load = function(id, cb) {
    this.findOne({
       _id: id
    })
    .populate('creator', 'name username')
    .populate('commissioner', 'name username') 
    .exec(cb);
};

mongoose.model('Group', GroupSchema);
如果我想根据commissioner字段查询restapi呢?或创建者、名称或已创建字段?这是否可能使用Express的路由?如果可能,是否有最佳做法


似乎与其处理这些独特的情况,不如使用一些通用的方法,返回基于req.params匹配的所有组,因为如果模型稍后发生更改,我就不需要更新控制器。如果这是解决问题的方法,那么修改all()函数以根据req.params进行查找可能是解决方案?所以,如果没有提供任何内容,那么它将返回所有内容,但当您提供更多get参数时,它将深入了解您要查找的内容

我建议使用
req.query
来匹配模式中的字段。 如果发送请求,如
/groups?name=someGrp&enableScores=1
请求查询将如下所示

{name: "someGrp", enableScores: 1}
Group.find(req.query, callback);
您可以像这样将此对象传递给find方法

{name: "someGrp", enableScores: 1}
Group.find(req.query, callback);

这种方法适用于简单的属性匹配查询,但对于比较和数组属性等其他内容,您必须编写额外的代码。

谢谢。这正是我想要的。
app.get('/groups',groups.all)仍然保持不变?