最近因为项目,接触了MongoDB,因为是分工合作,我负责的部分主要是实现前端对数据库增删查改的需求,因此以下内容只着重于针对不同问题如何进行解决。
整个工程的最终目的是通过mongoose编写数据库方法,并将其使用REST风格封装成API供前端调用。(在实际工程中,DELETE和PUT也尽量被转成POST方法了)。
首先在server.js中导入mongoose模块,进行数据库连接,开启监听,在settings.js中设置数据库ip、端口号及路由地址等信息,在routes.js中设置具体的路由及调用的函数,调用的函数放在’../ controllers/’文件夹中,controllers中的函数对输入和输出进行整合,通过调用定义在’../models/’文件夹中的Schema, model和对数据库的基础操作函数,实现API的封装。
在工程文件夹中使用命令行执行node server.js后,即可使用postman等工具测试写好的API了,另外对数据库的可视化,使用Robomongo工具。
关键代码:
server.js:
// import necessary modules var express = require('express'); var bodyParser = require('body-parser'); var mongoose = require('mongoose'); // import necessary self-defined modules var webEntry = require('./settings').webEntry; var _config = webEntry.config || 'config', domainName = webEntry.domainName, route = webEntry.route; var config = require('./' + _config), dbUri = webEntry.dbUri, restPort = webEntry.restPort, routes = require('./routes/'+route); // 数据库连接 var db = mongoose.connection; if (typeof(db.db) === 'undefined') { mongoose.connect(dbUri); } db.on('error', console.error.bind(console, 'connection error:')); db.once('open', function () { console.log(domainName + ' MongoDB: init.js'); }); // node服务 var app = express(); app.set('port', restPort); app.use(bodyParser.json({ limit: config.bodyParserJSONLimit })); app.use(bodyParser.urlencoded({ extended: true })); // 跨域访问 app.all('*', function (req, res, next) { var domain = req.headers.origin; if (config.Access_Control_Allow_Origin.indexOf(domain) > -1) { res.setHeader('Access-Control-Allow-Origin', domain); res.setHeader('Access-Control-Allow-Credentials', true); res.setHeader('Access-Control-Allow-Methods', 'GET, POST, DELETE, PUT'); res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With, Content-Type, Authorization'); res.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1. res.setHeader("Pragma", "no-cache"); // HTTP 1.0. res.setHeader("Expires", "0"); // Proxies. } if ('OPTIONS' == req.method) return res.sendStatus(200); next(); }); // 路由设置 routes(app, webEntry); // 找不到正确路由时,执行以下操作 app.all('/*', function(req, res, next) { res.send("Router Error!"); }); app.listen(app.get('port'));
settings.js
//设置数据库所在IP,端口及数据库名称 var ip="localhost" var port="27017" var db = "cdmis" module.exports = { webEntry: { domain: ip, domainName: ip, path: '', dbUri: 'mongodb://'+ip+':'+port+'/'+ db, //API端口号 restPort:4050, //路由地址所在文件 route: 'routes', routeIO: '', view: '', config: '' } }
routes.js
// self-defined configurations var config = require('../config'); // middlewares //声明中间件集合 // controllers //声明控制器集合 var doctorCtrl = require('../controllers/doctor_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); //… };
每次增加新的API时都要在module.exports内增加app.get()或app.post()并注意controllers的路径的require