NodeJs 使用 Mongodb
之前我们学习了Mongodb 的Shell命令, 现在我们再一个小小的node项目中使用一下mongodb吧我们先来初始化一个express项目
第一步
$ npm install express-generator -g // 全局安装
第二步
$ express testmongodb // 初始化一个项目
第三步
$ cd testmongodb
$ cnpm install
第四步
// 启动 $ npm start 然后在浏览器中打开 http://localhost:3000/ 网址就可以看到这个应用了。更改目录结构
| bin | modle - db.js | config - config.js | views | public | routes - index.js | app.js | package.json完善代码阶段
$ cnpm install mongodb ---save // 安装mongodb
// config.js var baseUrl = "mongodb://localhost:27017"; var dbbase = "/mongodb_demo"; // 这里是我的数据库名称哦 module.exports = { "dburl": baseUrl + dbbase };
// db.js /** * 数据库封装 * */ var MongodbClient = require('mongodb').MongoClient var assert = require('assert') var config = require('../config/config.js') /** * 连接数据库 */ function __connectDB(callback) { MongodbClient.connect(config.dburl, function (err, db) { callback(err, db) }) } /** * 插入一条数据 * @param {*} collectionName 集合名 * @param {*} Datajson 写入的json数据 * @param {*} callback 回调函数 */ function __insertOne(collectionName, Datajson, callback) { __connectDB(function (err, db) { var collection = db.collection(collectionName); collection.insertOne(Datajson, function (err, result) { callback(err, result); // 通过回调函数上传数据 db.close(); }) }) } /** * 查找数据 * @param {*} collectionName 集合名 * @param {*} Datajson 查询条件 * @param {*} callback 回调函数 */ function __find(collectionName, JsonObj, callback) { var result = []; if (arguments.length != 3) { callback("find函数必须传入三个参数哦", null) return } __connectDB(function (err, db) { var cursor = db.collection(collectionName).find(JsonObj); if (!err) { cursor.each(function (err, doc) { assert.equal(err, null) // 使用node的assert模块来判断是否出错了 // 如果出错了,那么下面的也将不会执行了 if (doc != null) { result.push(doc) } else { callback(null, result) db.close(); } }) } }) } /** * * 删除数据(删除满足条件的所有数据哦) * @param {*} collectionName 集合名 * @param {*} json 查询的json数据 * @param {*} callback 回调函数 */ function __DeleteMany(collectionName, json, callback) { __connectDB(function (err, db) { assert.equal(err, null) //删除 db.collection(collectionName).deleteMany( json, function (err, results) { assert.equal(err, null) callback(err, results); db.close(); //关闭数据库 } ); }); } /** * 修改数据 * @param {*} collectionName 集合名 * @param {*} json1 查询的对象 * @param {*} json2 修改 * @param {*} callback 回调函数 */ function __updateMany(collectionName, json1, json2, callback) { __connectDB(function (err, db) { assert.equal(err, null) db.collection(collectionName).updateMany( json1, json2, function (err, results) { assert.equal(err, null) callback(err, results) db.close() } ) }) } /** * 获取总数 * @param {*} collectionName 集合名 * @param {*} json 查询条件 * @param {*} callback 回调函数 */ function __getCount(collectionName, json, callback) { __connectDB(function (err, db) { db.collection(collectionName).count(json).then(function (count) { callback(count) db.close(); }) }) } /** * 分页查找数据 * @param {*} collectionName 集合名 * @param {*} JsonObj 查询条件 * @param {*} C 【可选】传入的参数,每页的个数、显示第几页 * @param {*} C callback */ function __findByPage(collectionName, JsonObj, C, D) { var result = []; //结果数组 if (arguments.length == 3) { //那么参数C就是callback,参数D没有传。 var callback = C; var skipnumber = 0; //数目限制 var limit = 0; } else if (arguments.length == 4) { var callback = D; var args = C; //应该省略的条数 var skipnumber = args.pageamount * args.page || 0; //数目限制 var limit = args.pageamount || 0; //排序方式 var sort = args.sort || {}; } else { throw new Error("find函数的参数个数,必须是3个,或者4个。"); return; } //连接数据库,连接之后查找所有 __connectDB(function (err, db) { var cursor = db.collection(collectionName).find(JsonObj).skip(skipnumber).limit(limit).sort(sort); cursor.each(function (err, doc) { if (err) { callback(err, null); db.close(); //关闭数据库 return; } if (doc != null) { result.push(doc); //放入结果数组 } else { //遍历结束,没有更多的文档了 callback(null, result); db.close(); //关闭数据库 } }); }); } module.exports = { __connectDB, __insertOne, __find, __DeleteMany, __updateMany, __getCount, __findByPage } // db.js 文件是数据库操作的DAO 层的封装
//app.js var createError = require('http-errors'); var express = require('express'); var path = require('path'); var cookieParser = require('cookie-parser'); var logger = require('morgan'); var indexRouter = require('./routes/index'); var usersRouter = require('./routes/users'); // 修改【1】 global.db = require('./modle/db.js') // 引入数据库封装好的 DAO 层方法 var app = express(); // view engine setup app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'jade'); app.use(logger('dev')); app.use(express.json()); app.use(express.urlencoded({ extended: false })); app.use(cookieParser()); app.use(express.static(path.join(__dirname, 'public'))); // 修改【2】 这里配置我们的路由 app.use('/', indexRouter) app.use('/users', usersRouter) app.use('/testconnect', indexRouter) app.use('/testdeletemany', indexRouter) app.use('/testupdatemany', indexRouter) app.use('/count', indexRouter) app.use('/testfingbypage', indexRouter) // catch 404 and forward to error handler app.use(function(req, res, next) { next(createError(404)); }); // error handler app.use(function(err, req, res, next) { // set locals, only providing error in development res.locals.message = err.message; res.locals.error = req.app.get('env') === 'development' ? err : {}; // render the error page res.status(err.status || 500); res.render('error'); }); module.exports = app;
// index.js // 这里用来配置路由操作 var express = require('express'); var router = express.Router(); /* GET home page. */ router.get('/', function (req, res, next) { res.render('index', { title: 'Express' }); }); // 测试数据库连接 router.get('/testconnect', function (req, res) { global.db.__connectDB(function (err, db) { if (err) { console.log(err) return } console.log(db) res.render('index', { title: '连接数据库成功' }) }) }) // 测试插入数据 router.get('/testinsert', function (req, res) { global.db.__insertOne('student', { "name": "zjj", "age": 33, "interests": ['play'], "sex": "男" }, function (err, result) { if (!err) { console.log(result) res.render('index', { title: '插入一条数据成功' }) } else { console.log(err) } }) }) // 查找数据 router.get('/testfind', function (req, res) { global.db.__find('student', { age: { $lt: 30 } }, function (err, result) { if (!err) { console.log(result) res.render('index', { title: '查询成功' }) } else { console.log(err) } }) }) // 删除数据(删除符合条件的全部数据哦) router.get('/testdeletemany', function (req, res) { global.db.__DeleteMany('student', { "age": { $gte: 19 } }, function (err, result) { if (!err) { console.log(result) res.render('index', { title: '删除成功' }) } else { console.log(err) } }) }) // 修改数据(满足条件的数据全部都会被修改) router.get('/testupdatemany', function (req, res) { global.db.__updateMany( 'student', { "name": "zjj" }, { $set: { name: "cnm" } }, function (err, result) { if (!err) { console.log(result) res.render('index', { title: '修改成功' }) } } ) }) // 统计总数 router.get('/count', function (req, res) { global.db.__getCount('student', {}, function (count) { console.log(count) res.render('index', { title: `一共${count}条数据` }) }) }) // 分页显示 // page是页数,从 0 开始 router.get('/testfingbypage', function (req, res) { global.db.__findByPage('student', {}, { "pageamount": 6, "page": 0 }, function (err, result) { if (err) { throw err; } res.send(result); console.log(result.length); }) }) module.exports = router;
启动一次
$ npm start
打开localhost:3000
测试一下路由吧,再看看自己数据库中是否进行了相关操作了呢~
相关推荐
lbyd0 2020-11-17
zhushenghan 2020-11-09
sunnnyduan 2020-10-16
sdmzhu 2020-09-01
mkhhxxttxs 2020-09-16
xiaohai 2020-09-16
apexlj 2020-08-16
zyshappy 2020-08-16
BigYellow 2020-11-16
sushuanglei 2020-11-12
我心似明月 2020-11-09
不要皱眉 2020-10-14
xiaohai 2020-09-29
songxiugongwang 2020-09-22
萌亖 2020-09-17
LuckyLXG 2020-09-08
newcome 2020-09-09
jaylong 2020-08-19