
/**
回调函数(函数作为参数):
0. 外层函数调用的地方,一定是外层函数体先执行,回调函数和普通函数地址一样,然后看函数体规定回调函数怎么执行。
1. 异步时候使用回调函数, 无论是否异步,回调函数相当于在函数调用地方,使用函数的返回值。
2. 回调函数也可以看成是扩展了函数体的功能,因为回调函数可以不一样,其余是公用的功能。
3. 回调函数中间媒介作用,把调用函数的地方和定义函数的地方,连接到了一起,可以进行数据的传递
4. 原来都是参数给函数体中使用,现在函数体中的数据可以反过来在参数中使用。
*/
var express = require("express");
var app = express();
var db = require("./model/db.js");
//插入数据,使用我们自己封装db模块,就是DAO。
app.get("/charu",function(req,res){
//三个参数,往哪个集合中增加,增加什么,增加之后做什么
db.insertOne("teacher",{"name":"小红"},function(err,result){
if(err){
console.log("插入失败");
return;
}
res.send("插入成功");
});
/*
insertOne = function (collectionName, json, callback) {
_connectDB(function (err, db) {
db.collection(collectionName).insertOne(json, function (err, result) {
callback(err, result);
db.close(); //关闭数据库
})
})
};
*/
});
//查找
app.get("/du",function(req,res){
//这个页面现在接受一个page参数。
var page = parseInt(req.query.page); //express中读取get参数很简单
//查找4个参数,在哪个集合查,查什么,分页设置,查完之后做什么
db.find("canguan",{},{"pageamount":6,"page":page},function(err,result){//先执行find函数体,函数这个特殊参数什么时候执行取决于函数体怎么写,
if(err){
console.log(err);
}
res.send(result);
console.log(result.length);
});
});
//删除
app.get("/shan",function(req,res){
var borough = req.query.borough;
db.deleteMany("canguan",{"borough":borough},function(err,result){//先执行deleteMany函数体,函数什么时候执行取决于函数体
if(err){
console.log(err);
}
res.send(result);
});
});
//修改
app.get("/xiugai",function(req,res){
db.updateMany(
"canguan", //集合名字
{
"borough":"Manhattan" //改什么
},
{
$set: { borough: "北京" } //怎么改
},
function(err,result){ //改完之后做什么
if(err){
console.log(err);
}
res.send(result);
}
);
});
app.listen(3000);


/**
* 回调函数看成就是一个普通函数地址。
*/
//这个模块里面封装了所有对数据库的常用操作
var MongoClient = require('mongodb').MongoClient;
var settings = require("../settings.js");
//不管数据库什么操作,都是先连接数据库,所以我们可以把连接数据库
//封装成为内部函数
function _connectDB(callback) {//先执行_connectDB函数体,决定了函数什么时候怎么执行
var url = settings.dburl; //从settings文件中,都数据库地址
//连接数据库
MongoClient.connect(url, function (err, db) {
if (err) {
callback(err, null);
return;
}
callback(err, db);
});
}
//插入数据,每次都要打开关闭数据库
exports.insertOne = function (collectionName, json, callback) {
_connectDB(function (err, db) {//先执行_connectDB函数体,这个函数什么时候执行取决于函数的函数体
db.collection(collectionName).insertOne(json, function (err, result) {
callback(err, result);
db.close(); //关闭数据库
})
})
};
//查找数据,找到所有数据。args是个对象{"pageamount":10,"page":10}
exports.find = function (collectionName, json, C, D) {//js没有函数重载,必须进行参数修正。
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) {//先执行_connectDB函数体,这个函数什么时候执行取决于函数的函数体
var cursor = db.collection(collectionName).find(json).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(); //关闭数据库
}
});
});
}
//删除
exports.deleteMany = function (collectionName, json, callback) {
_connectDB(function (err, db) {
//删除
db.collection(collectionName).deleteMany(
json,
function (err, results) {
callback(err, results);
db.close(); //关闭数据库
}
);
});
}
//修改
exports.updateMany = function (collectionName, json1, json2, callback) {
_connectDB(function (err, db) {
db.collection(collectionName).updateMany(
json1,
json2,
function (err, results) {
callback(err, results);
db.close();
});
})
}
exports.getAllCount = function (collectionName,callback) {
_connectDB(function (err, db) {
db.collection(collectionName).count({}).then(function(count) {
callback(count);
db.close();
});
})
}

/**
* 回调函数就是普通函数地址。
*/
module.exports = {
"dburl" : "mongodb://localhost:27017/haha"
}