应用Mongoose开发MongoDB(3)控制器(controllers)

控制器的基本构成与如何通过路由调用

控制器中通过建立函数并导出,实现前端对数据库的查询、新建、删除与修改的需求,并使之可以在路由中调用,完成API的封装。本文着重于结构之间的关系,具体问题解决方法将在后文给出。

下面代码就是一个简单但完整的控制器文件,命名为comment_controller.js, 存放在~/controllers文件夹下:

var   config = require(‘../config‘),
         Comment = require(‘../models/comment‘);

//根据doctorId查询相关评价 2017-03-30 GY
exports.getCommentsByDoc = function(req, res) {
         //查询条件
         var doctorObject = req.body.doctorObject;
         var query = {doctorId:doctorObject._id};

         //设置参数
         var opts = ‘‘;
         var fields = {‘_id‘:0, ‘revisionInfo‘:0};
         var populate = {path: ‘patientId‘, select:{‘_id‘:0, ‘revisionInfo‘:0}};

         Comment.getSome(query, function(err, item) {
                   if (err) {
                    return res.status(500).send(err.errmsg);
             }
             res.json({results: item});
         }, opts, fields, populate);
}

  

首先声明一些用到的常量,包括全局设置和需要调用的数据模型等。

然后将方法建立函数并导出,注意建立函数的时候,传入参数为req, res. 其中req为输入参数,使用GET方法(或一些POST方法)时,在URL中的参数通过req.query传入,在POST等方法,在body中的参数通过req.body传入。res为返回参数,一般有两种方式返回:

状态码加信息:(return res.status(500).send(err.errmsg))

或者json格式:(return res.json(result:’error!’))

如果希望导出的函数可以复用到不同路由中组合,也就是使用一个路由调用多个函数,就要允许前面的导出函数可以进行下一步,这就需要在传入的参数中多加一个next, 并在函数中允许进行下一步的位置使用next()函数。

仍以这个函数为例,如何在路由中调用呢?

在第1篇中提过的~/routes/routes.js文件:

// self-defined configurations
var config = require(‘../config’);

// middlewares
//声明中间件集合

// controllers
//声明控制器集合
var doctorCtrl = require(‘../controllers/doctor_controller’);

//添加comment_controller.js中声明的函数
var commentCtrl = require(‘../controllers/comment_controller’);

module.exports = function(app, webEntry) {
app.get(‘/’, function(req.res) {
    res.send(‘Server Root’);
});

//设置路由路径及路径需要调用的函数或组合
app.post(‘/doctor/postDocBasic’, doctorCtrl.insertDocBasic);
app.get(‘/doctor/getDoctorInfo’, doctorCtrl.getDoctorObject, doctorCtrl.getComments, doctorCtrl.getDoctorInfo);
//…

//设置方法路由及需要调用的函数
app.get(‘/comment/getComments’, doctorCtrl.getDoctorObject, commentCtrl.getCommentByDoc);

};

  

为了便于理解,附上关于doctorCtrl.getDoctorObject的代码:

// doctor_controller.js
var config = require(‘../config’);
var Doctor = require(‘../models/doctor’);
//通过doctor表中userId查询_id 2017-03-30 GY
//修改:增加判断不存在ID情况 2017-04-05 GY
exports.getDoctorObject = function (req, res, next) {
         if (req.query.userId == null || req.query.userId == ‘‘) {
                   return res.json({result:‘请填写userId!‘});
         }
    var query = {
        userId: req.query.userId
    };
    Doctor.getOne(query, function (err, doctor) {
        if (err) {
            console.log(err);
            return res.status(500).send(‘服务器错误, 用户查询失败!‘);
        }
        if (doctor == null) {
                 return res.json({result:‘不存在的医生ID!‘});
        }
        req.body.doctorObject = doctor;
        next();
    });
};

  

这段代码的目的是输入doctor表里的userId查询到对应条目,并将信息传入到req.body.doctorObject中。可以猜想,这段代码是可以复用的。当然这段代码复用的情况会比较局限,因为比较粗糙,关于这一点,后文将给出更为全面的复用代码。

在工程文件夹中运行命令行,运行命令:

node server.js

如果没有错误,会有以下提示:

提示内容在server.js中定义。

为了测试API是否可用,推荐使用postman应用(google store下载)。在请求框中输入URL:

localhost:4050/comment/getComments

点击Params输入键与值,则请求变为:

localhost:4050/comment/getComments?userId=doc01

点击Send即可发送请求等待返回,如果一切顺利,会有类似返回:

如果是POST等方法,需要在body中输入的,选择下面的body, raw, 并将后面的格式改为JSON:

注意端口4050是在setting.js中定义的,请参考本系列第1篇文章。

如果测试本地的工程,可以直接使用localhost, 如果测试部署在其他电脑或服务器上的工程,将localhost换成对应电脑或服务器的IP地址即可。

时间: 2024-10-10 13:58:57

应用Mongoose开发MongoDB(3)控制器(controllers)的相关文章

应用Mongoose开发MongoDB(2)模型(models)

数据模型及基础操作模板 为了使工程结构清晰,将数据模型(Schema, Model)的建立与增删查改的基础操作模板写在一起,命名为数据库设计中的Collection(对应于关系型数据库中的表定义)名,并存储在models文件夹中. Schema与Model的建立: Schema是Mongoose里的数据模式,可以理解为表结构定义:每个Schema会映射到MongoDB中的一个Collection,不具备操作数据库的能力. 考虑以下代码: //引入mongoose模块 var mongoose =

nodejs(一) 简单登录验证 使用mongoose 操作MongoDB

---恢复内容开始--- 开发使用webstorm 9  新建nodejs+express 项目 newfarmer 文章目录 配置Mongoose 创建目录及文件 插入数据,POST提交JSON增加一条记录 查询数据,取出刚增加的记录 1. 配置Mongoose 增加mongoose的类库 npm install mongoose --save 2.创建目录及文件 在models目录,增加mongodb.js文件 数据库连接文件1 /** 2 * Created by hao on 2014/

node 通过mongoose实现 mongodb的增删改

node 通过mongoose实现 mongodb的增删改 新建文件test.js 内容如下: var mongoose = require('mongoose') , Schema = mongoose.Schema; mongoose.connect('mongodb://localhost/test'); var BlogSchema = new Schema({ id : {type : Number, index : true} ,title : {type : String} });

[转]iOS开发之视图控制器(UIViewController)

视图控制器应该在MVC设计模式中扮演控制层(C)的角色,UIViewController的职责对内管理与之关联的View,对外跟其他UIViewController通信和协调.一个视图控制器管理一个视图(它可以有子视图),其view属性指向它所管理的视图.UIViewController类可以有子类,可以使用一个系统的UIViewController子类或者直接自己创建一个UIViewController的子类. 使用代码创建控制器和视图. 开始创建一个基于窗口的Empty Applicatio

iOS开发UI篇—控制器的View的创建

iOS开发UI篇—控制器的View的创建 一.6种创建控制器View的方式 1 #import "NJAppDelegate.h" 2 #import "NJViewController.h" 3 /* 4 1.没有同名xib情况下 5 2.通过 storyboard 创建 6 3.有指定xib情况下创建 7 4.有同名xib情况 8 5.有同名去掉controll的情况 9 6.loadveiw 10 */ 11 @implementation NJAppDele

iOS开发中标签控制器的使用——UITabBarController

正文 iOS开发中标签控制器的使用——UITabBarController 一.引言 与导航控制器相类似,标签控制器也是用于管理视图控制器的一个UI控件,在其内部封装了一个标签栏,与导航不同的是,导航的管理方式是纵向的,采用push与pop切换控制器,标签的管理是横向的,通过标签的切换来改变控制器,一般我们习惯将tabBar作为应用程序的根视图控制器,在其中添加导航,导航中在对ViewController进行管理. 二.创建一个标签控制器 通过如下的步骤,我们可以很简便的创建一个TabBarCo

iOS开发UI篇—控制器的创建

iOS开发UI篇—控制器的创建 说明:控制器有三种创建方式,下面一一进行说明. 一.第一种创建方式(使用代码直接创建) 1.创建一个空的IOS项目. 2.为项目添加一个控制器类. 3.直接在代理方法中创建一个控制器. 1 #import "YYAppDelegate.h" 2 #import "YYViewController.h" 3 4 @implementation YYAppDelegate 5 6 - (BOOL)application:(UIApplic

nodejs 使用mongoose 操作mongodb

nodejs操作mongodb可以使用mongoose: Mongoose is a MongoDB object modeling tool designed to work in an asynchronous environment. 安装mongoose: npm install mongoose ///获取mongodb连接var conn = mongoose.connect('mongodb://localhost/mytest');      var Schema = mongo

iOS开发中视图控制器ViewControllers之间的数据传递

iOS开发中视图控制器ViewControllers之间的数据传递 这里我们用一个demo来说明ios是如何在视图控制器之间传递重要的参数的.本文先从手写UI来讨论,在下一篇文章中讨论在storyboard中传递数据. 首先新建一个空工程,并添加一个根视图控制器类,如下图所示: # 在函数didFinishLunchingWithOption中添加几行代码,完成后如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 - (BOOL)application:(UIApplication