應用Mongoose開發MongoDB(3)控制器(controllers)

來源:互聯網
上載者:User

標籤:封裝   get   理解   方法   使用者   one   nod   資訊   path   

控制器的基本構成與如何通過路由調用

 

控制器中通過建立函數並匯出,實現前端對資料庫的查詢、建立、刪除與修改的需求,並使之可以在路由中調用,完成API的封裝。本文著重於結構之間的關係,具體問題解決方案將在後文給出。

 

下面代碼就是一個簡單但完整的控制器檔案,命名為comment_controller.js, 存放在~/controllers檔案夾下:

 

var   config = require(‘../config‘),         Comment = require(‘../models/comment‘); //根據doctorId查詢相關評價 2017-03-30 GYexports.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 configurationsvar 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.jsvar config = require(‘../config’);var Doctor = require(‘../models/doctor’);//通過doctor表中userId查詢_id 2017-03-30 GY//修改:增加判斷不存在ID情況 2017-04-05 GYexports.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)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.