使用查询来searchtask_name时,通过id查找function已经实现

好吧,我正在尝试创build一个简单的待办事项列表,网页API。 我有基本的function实施,并正常工作,但我试图使用查询由我的代码中声明的task_namesearch,但无论我似乎无法得到它的function。

app.js

var express = require('express') , routes = require('./routes') , http = require('http') , tasks = require('./routes/tasks') , mongoose = require('mongoose'); // MongoDB Connection mongoose.connect('mongodb://localhost/task_tracker'); var app = express(); app.configure(function(){ app.set('port', 3000); app.set('views', __dirname + '/views'); app.set('view engine', 'jade'); app.use(express.favicon()); app.use(express.logger('dev')); app.use(express.bodyParser()); app.use(express.methodOverride()); app.use(app.router); app.use(express.static(__dirname + '/public')); }); app.configure('development', function(){ app.use(express.errorHandler()); }); app.get('/', routes.index); app.get('/tasks', tasks.index); app.get('/tasks/:id', tasks.show); //app.get('/tasks/tasks?', tasks.search); app.get('/tasks?', tasks.search); app.post('/tasks', tasks.create); app.put('/tasks', tasks.update); app.del('/tasks', tasks.delete); http.createServer(app).listen(app.get('port'), function(){ console.log("Express server listening on port 3000"); }); 

tasks.js

 var Task = require('../models/task').Task; /* * Tasks Routes */ exports.index = function(req, res) { Task.find({}, function(err, docs) { if(!err) { res.json(200, { tasks: docs }); } else { res.json(500, { message: err }); } }); } exports.show = function(req, res) { var id = req.params.id; Task.findById(id, function(err, doc) { if(!err && doc) { res.json(200, doc); } else if(err) { res.json(500, { message: "Error loading task." + err}); } else { res.json(404, { message: "Task not found."}); } }); } exports.create = function(req, res) { var task_name = req.body.task_name; // Name of task. var description = req.body.task_description; // Description of the task //Task.findOne({ name: task_name }, function(err, doc) { // This line is case sensitive. Task.findOne({ name: { $regex: new RegExp(task_name, "i") } }, function(err, doc) { // Using RegEx - search is case insensitive if(!err && !doc) { var newTask = new Task(); newTask.name = task_name; newTask.description = description; newTask.save(function(err) { if(!err) { res.json(201, {message: "Task created with name: " + newTask.name }); } else { res.json(500, {message: "Could not create task. Error: " + err}); } }); } else if(!err) { // User is trying to create a task with a name that already exists. res.json(403, {message: "Task with that name already exists, please update instead of create or create a new task with a different name."}); } else { res.json(500, { message: err}); } }); } exports.update = function(req, res) { var id = req.body.id; var task_name = req.body.task_name; var task_description = req.body.task_description; Task.findById(id, function(err, doc) { if(!err && doc) { doc.name = task_name; doc.description = task_description; doc.save(function(err) { if(!err) { res.json(200, {message: "Task updated: " + task_name}); } else { res.json(500, {message: "Could not update task. " + err}); } }); } else if(!err) { res.json(404, { message: "Could not find task."}); } else { res.json(500, { message: "Could not update task." + err}); } }); } exports.delete = function(req, res) { var id = req.body.id; Task.findById(id, function(err, doc) { if(!err && doc) { doc.remove(); res.json(200, { message: "Task removed."}); } else if(!err) { res.json(404, { message: "Could not find task."}); } else { res.json(403, {message: "Could not delete task. " + err }); } }); } exports.search = function(req, res) { var name = req.query.name; Task.findByName(name, function(err, doc) { if(!err && doc) { res.json(200, doc); } else if(err) { res.json(500, { message: "Error loading task." + err}); } else { res.json(404, { message: "Task not found."}); } }); } 

task.js模型

 var mongoose = require('mongoose') , Schema = mongoose.Schema; var taskSchema = new Schema({ name : { type: String, required: true, trim: true, index: { unique: true } } , description : { type: String, required: true } , date_created : { type: Date, required: true, default: Date.now } }); var task = mongoose.model('task', taskSchema); module.exports = { Task: task }; 

基本上我只是试图使用类似的function,以我的searchidfunction,但我知道我不能只使用参数,我不知道如何让查询工作。 任何帮助,将不胜感激。 如果你不能告诉我正在使用Node.js,Express和Mongodb。

TL; DR:您需要合并tasks.indextasks.search路由,即。 喜欢这个:

 tasks.index = function(req, res, next) { if (req.query.name !== undefined) { // pass on to next handler return next(); } // the rest of your tasks.index. }); 

并像这样调整路由器设置:

 app.get('/tasks', tasks.index); app.get('/tasks', tasks.search); 

为什么? 查询string不是路由的一部分。 那么“/任务?” 只是/ task + 1字符的正则expression式,而不是查询string – 查询string不是路由匹配的一部分。

更具体地说,你有你的路线:

 app.get('/', routes.index); app.get('/tasks', tasks.index); app.get('/tasks?', tasks.search); 

最后, /tasks? 路线不会像你似乎期望的那样得到注册。 问号不代表查询string处理,它是路由正则expression式的一部分,基本上意味着你会捕获任何给/tasks路由添加一个字符的东西,例如/ tasksa,/ tasksb,/ tasks7等等。所以, 7个字符,其中前六个是已知的,最后一个是不同的,不包括查询string。

你不能在路由器中parsing查询string,它在单独的控制器中,就像这样:

 tasks.search = function(req, res) { if (req.query.name) { // you have the name query } // etc. } 

更多的build议是,通常在REST API上完成的是拥有全局tasks.index,就像你在那里,并在其上添加两个东西:分页和过滤/search。 如果你只想要一个结果

分页是page=3&limit=10 (第3页,每页10项),筛选/sorting/search是你想要的。 取决于你想要的,这就是你如何暴露它。

IE浏览器。 你可能想按名称sorting:

 if (req.query.sort === 'name:desc') { mongoCursor.sort = {name: -1}; } 

或者某种东西。

所以你可能有一个search ,或者可能直接一个name查询参数,像这样:

 GET /tasks?name=<search term> 

name参数通常是可选的。 所以你的req会列出所有的东西,如果设置了name查询string,它会首先按名字过滤。

您的查询构build过程可以如下所示:

 tasks.index = function(req, res) { var query = {}; if (req.query.name) { query.name = req.query.name; } Tasks.find(query, ...); 

在这种情况下,您不需要任务模型上的助手。

我发现这种方法也适用。

 /** * Module dependencies. */ var express = require('express'), cors = require('cors'), routes = require('./routes'), http = require('http'), tasks = require('./routes/tasks'), mongoose = require('mongoose'), search = require('./routes/search'); var Task = require('./models/task').Task; // MongoDB Connection mongoose.connect('mongodb://localhost/task_tracker'); var app = express(); app.configure(function() { app.set('port', 3000); app.set('views', __dirname + '/views'); app.set('view engine', 'jade'); app.use(express.favicon()); app.use(express.logger('dev')); app.use(express.bodyParser()); app.use(express.methodOverride()); app.use(app.router); app.use(express.urlencoded()); app.use(express.json()); app.use(cors()); }); app.use(function(req, res, next) { res.header("Access-Control-Allow-Origin", "*"); res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); next(); }); var corsOptions = { origin: 'http://localhost:3000' }; app.get('/', routes.index); app.get('/tasks', tasks.index); //app.get('/search', tasks.FindByQuery); //app.get('/tasks/:task.:name?', task.FindByQuery); app.get('/search', function(req, res, next) { var query = req.query //res.send(query['name']); Task.findOne({name: query['name']}, function(err, doc) { if(!err && doc) { res.json(200, doc); } else if(err) { res.json(500, { message: "Error loading task." + err}); } else { res.json(404, { message: "Task not found."}); } }); //res.end(JSON.stringify(query)); }); app.get('/tasks/:id', tasks.show); app.post('/tasks', tasks.create); app.put('/tasks', tasks.update); app.del('/tasks', tasks.delete); http.createServer(app).listen(app.get('port'), function() { console.log("Express server listening on port 3000"); });