應用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地址即可。
應用Mongoose開發MongoDB(3)控制器(controllers)