express + nodejs + mongodb实现一个简单的数据库的增删改功能。
1 首先创建express工程目录
---html
---node_modules
---resources
app.js #入口模块
config.js #配置模块
handler.js #业务处理模块
router.js #路由模块
package.json #包管理
2 直接先上数据库代码
本文主要是描述nodejs的mongodb数据库操作,所以其余代码,可以看本文后边,package.json文件后面也有。如果想看包的列表和版本在后面~
业务处理模块:handle.js
var path = require('path');
//在此导入mongodb
//当然,首先得安装mongodb,且在工程目录下npm i mongodb才可以导入进来。
var mongodb = require('mongodb');
// config.js主要配置了nodejs的端口号和 mongodb的端口号
var config = require('./config.js');
var url = require('url');
//外部由路由模块router.js导入,这里直接使用module.exports向外暴露一个API,
//1. 数据库的“查查查查查查查查查查查查查”
module.exports.index = function (req, res) {
// 创建一个mongodb实例
var MongoClient = mongodb.MongoClient;
// 把这个实例连接到mongodb服务器
MongoClient.connect(config.connStr, function (err, db) {
if (err) {
throw err;
}
// 这里有个坑,新版本的mongo需要在连接成功后,连接一个数据库。
// 注意:这里的数据库可以是mongodb中存在的,也可以是不存在的,如果不存在,则默认自动创建一个数据库vueStudy。
var mydb = db.db('vueStudy');
// 查询在vueStudy这个数据库下 名为 prodlist 的 一个集合,
// find() 功能:这个集合下所有的数据全部导出。格式为JSON
// toArray 功能:变成一个数组,在回调函数中返回一个docs,这个docs是一个数组。
mydb.collection('prodlist').find().toArray(function (err, docs) {
if (err) {
throw err;
}
// 关闭数据库连接
db.close();
// 将最终的数据,以JSON格式发送给客户端。
// 注意:1.这里的docs,其实就是一个JSON对象,这个JSON对象的Body中有所有的数据。
// 2.在服务器端只能发送字符串,但在客户端接收的时候,会自动变成对象。
res.end(JSON.stringify(docs));
});
});
};
//2. 数据库的“增增增增增增增增增增增增增增增”
module.exports.add = function (req, res) {
//同上,就不在那么详细的写了。
var MongoClient = mongodb.MongoClient;
MongoClient.connect(config.connStr, function (err, db) {
if (err) {
throw err;
}
var mydb = db.db('vueStudy');
// 执行查询操作
mydb.collection('prodlist').find().toArray(function (err, docs) {
if (err) {
throw err;
}
// 关闭数据库连接
var newData = {
//这个相当于取到最后一个元素的id,然后自增1.
id:docs[0].message[docs[0].message.length - 1].id + 1,
name:req.body.name,
ctime: new Date()
};
mydb.collection('prodlist').updateOne({"status":0},{$push : { "message": newData}});
db.close();
res.end('{status:0, message:"添加成功"}');
});
});
};
//2. 数据库的“删删删删删删删删删删删删删删删删删删删删删删”
module.exports.del = function(req, res) {
var MongoClient = mongodb.MongoClient;
MongoClient.connect(config.connStr, function (err, db) {
if (err) {
throw err;
}
var id = undefined;
var reqUrl = req.url;
//调试信息
//这里,可能写的有点蠢了...不过还懒得去找好方法...应该是能直接调用的
console.log('---------------------------' + reqUrl);
reqUrl = reqUrl.split('');
reqUrl.splice(0,1);
id = Number(reqUrl.join(''));
var mydb = db.db('vueStudy');
// 执行删除操作
// 执行查询操作
mydb.collection('prodlist').updateOne({"status":0},{$pull : { "message": {"id":id}}});
db.close();
//这里比较搞笑,明明我直接穿了一个JSON对象过去了,
//但是客户端那边接收到的就是一个string类型的字符串
//使用console.log打印出来也确实是Json格式的字符串
//但TM就是不能用JSON.parse()转换成JSON格式的文件...
// 所以这里在客户端那边匹配的时候,就直接是用字符串操作来匹配的...
// str1.includes(str2)
res.end('{status:0, message:"删除成功"}');
});
};
其他文件我就直接挨个展示了,需要调试的朋友,可以按照文头的工程目录结构创建,然后进行调试。
入口模块:app.js
// app.js 模块职责: 负责启动服务
// 1. 加载 express 模块
var express = require('express');
// 加载 config.js 模块
var config = require('./config.js');
// 加载路由模块
var router = require('./router.js');
var path = require('path');
// 1. 加载 body-parser 模块
var bodyParser = require('body-parser');
// 2. 创建 app 对象
var app = express();
// 配置使用 ejs 模板引擎,修改默认查找的模板文件后缀为 html
// 1. 设置模板文件的存放路径
app.set('views', path.join(__dirname, 'htmls'));
// 2. 创建一个自己的模板引擎,用来识别后缀是 html 的模板文件
app.engine('html', require('ejs').renderFile);
// 3. 使用刚才自己创建的这个模板引擎
app.set('view engine', 'html');
// 配置 body-parser 插件(挂载 body-parser 中间件)
// 一定要在正式处理请求之前设置body-parser
// req.body
// 如果参数 extended: false,表示在bodyparser内部,使用node.js内置的 querystring 模块把 用户post提交的查询字符串转换为 json 对象
// 如果参数 extended: true,表示在bodyparser内使用第三方的 qs 模块把 用户post提交的查询字符串转换为 json 对象
app.use(bodyParser.urlencoded({extended: false}));
// 3. 注册路由
// 设置app 与 router 相关联
// app.use('/', router);
app.use(router);
// 4. 启动服务
app.listen(config.port, function () {
console.log('http://localhost:' + config.port);
});
路由模块:router.js
// 路由模块,主要负责路由判断
// 1. 创建一个 router 对象 (router 对象既是一个对象,也是一个函数)
var express = require('express');
// 加载业务模块
var handler = require('./handler.js');
var path = require('path');
var router = express.Router();
router.get('/index', handler.index);
router.post('/add', handler.add);
router.use('/del',handler.del);
router.use('/lib', express.static(path.join(__dirname, 'lib')));
// 3. 返回 router 对象
module.exports = router;
配置文件:config.js
// 配置模块,主要职责是负责保存项目中的配置信息
module.exports = {
port: 9090,
connStr: 'mongodb://localhost:27017/hackernews'
};