1.在js中,凡是涉及到非内存的操作都为异步操作。如读写磁盘文件,访问url请求,读写数据库数据等都为异步操作。
2.在es6之前我们最常见对于异步的处理就是书写大量的callback函数,所以当你的下一步数据需要依赖于上一步异步操作的数据时,会出现很多嵌套,代码凌乱的感觉。这种后果就是你不会知道你的callback是在哪,并且如果报错也很难处理.这是我以前写的代码.
exports.get_charge_info = function (userid, orderno, callback) {
callback = callback == null ? nop : callback;
if (userid == null || orderno == null) {
callback(null);
}
var sql = "SELECT * FROM game_db.t_users_rechange_record WHERE userid = {0} AND orderno = '{1}';";
sql = sql.format(userid, orderno);
console.log("查询语句是:" + sql);
query(sql, function (err, rows, fields) {
if (err) {
callback(null);
throw err;
} else {
if (rows.length == 0) {
callback(null);
return;
}
callback(rows[0]);
}
});
};
3.在es6里面,为我们提供了一个Promise类.你可以理解为一个对象,包含进行态和完成态两部分。其中完成态分为失败态和成功态。我们可以把处理完的数据,若成功则放在成功态,失败则放在失败态。具体包装如下:
* @version 1.0 get promise请求包装
*
*/
static async get({ url, data }) {
//resolve 完成态, reject 失败态
return await new Promise(
(resolve, reject) => {
//get为异步操作 .then 后面的为执行完请求后 返回的数据的回调函数
axios.get(url, { params: data }).then((response) => {
resolve(response);
}).catch((err) => {
reject(err);
});
}
);
}
4. async 和 await 是搭配在一起使用的. 如果不写await则不会等待异步操作。
5.多条请求并发 可用promise.all解决,回来的结果会是一个数组,若其中一个请求失败,则不会返回任何数据,如下:
Promise.all([axios.get({ url: 'http://es6.ruanyifeng.com/#docs/set-map' }), axios.get({ url: 'http://es6.ruanyifeng.com/#docs/reflect' })])
.then(() => {
console.log('结束时间:' + new Date().getTime());
}).catch((err) => {
console.log(err);
});
6.mongodb 包装处理代码 第一段是对数据库操作的处理,第二段是怎样连接数据库,实现了连接池。
/**
* @version 1.0 mongoDB 管理
*
*/
const path = require('path');
const mongoClient = require('./mongoClient.js').MongoClientMannage;
const ObjectId = require('mongodb').ObjectId;
const log = require(path.join(__dirname, '../', '../', 'lib', 'log.js')).log;
class MongoDBUtil {
/**
* @version 1.0 插入文档(包含)
* @param collection 文档名
* @param data 插入数据
* @return ids 返回插入对应的id名
*/
static async insertDoc({ collection, data }) {
let db = mongoClient.getCoon();
if (db) {
return await new Promise(
(resolve, reject) => {
let dbCollection = db.collection(collection);
dbCollection.insert(data, (err, result) => {
if (err) {
log.error('MongoDBUtil:insertDoc ' + err);
reject(err);
}
//result.ops[0]._id
resolve(result);
});
}
);
}
return false;
}
/**
* @version 1.0 查找文档
* @param collection 文档名
* @param searchStr 搜索条件
* @param fields 指定字段返回
* @return result 搜索结果/false为未查找到
*/
static async findDoc({ collection, searchStr, fields = {} }) {
let db = mongoClient.getCoon();
if (db) {
return await new Promise(
(resolve, reject) => {
let dbCollection = db.collection(collection);
if (searchStr) {
if (searchStr._id) {
if (searchStr._id instanceof Object) {
if (searchStr._id.$in) {
for (let i = 0; i < searchStr._id.$in.length; i++) {
searchStr._id.$in[i] = ObjectId(searchStr._id.$in[i]);
}
}
} else {
searchStr._id = ObjectId(searchStr._id);
}
}
}
dbCollection.find(searchStr, fields).toArray(
(err, result) => {
if (err) {
log.error('MongoDBUtil:findDoc' + err);
reject(err);
}
resolve(result);
}
);
}
);
}
return false;
}
/**
* @version 1.0 聚合查询
*/
static async queryDoc({ collection, searchStr }) {
let db = mongoClient.getCoon();
if (db) {
return await new Promise(
(resolve, reject) => {
let dbCollection = db.collection(collection);
if (searchStr && searchStr.length > 0 && searchStr[0].$match && searchStr[0].$match._id) {
searchStr[0].$match._id = ObjectId(searchStr[0].$match._id);
}
dbCollection.aggregate(searchStr).toArray(
(err, result) => {
if (err) {
log.error('MongoDBUtil:queryDoc' + err);
reject(err);
}
resolve(result);
}
);
}
);
}
return false;
}
/***
* @version 1.0 根据条件来进行统计
*
*/
static async countDocs({ collection, searchStr = {} }) {
let db = mongoClient.getCoon();
if (db) {
return await new Promise(
(resolve, reject) => {
let dbCollection = db.collection(collection);
if (searchStr._id) {
searchStr._id = ObjectId(searchStr._id);
}
dbCollection.count(searchStr,
(err, result) => {
if (err) {
log.error('MongoDBUtil:countDocs' + err);
reject(err);
}
resolve(result);
}
);
}
);
}
return false;
}
/**
* @version 1.0 更新文档
* @param collection 文档名
* @param searchStr 搜索条件
* @param updateStr 更新条件
* @return flag true为更新成功 false 为未更新成功
*/
static async updateDoc({ collection, searchStr, updateStr }) {
let db = mongoClient.getCoon();
if (db) {
return await new Promise((resolve, reject) => {
let dbCollection = db.collection(collection);
if (searchStr._id) {
searchStr._id = ObjectId(searchStr._id);
}
dbCollection.update(searchStr, updateStr, (err, result) => {
if (err) {
log.error('MongoDBUtil:updateDoc' + err);
reject(err);
}
if (result.result.n > 0) {
resolve({ flag: true });
} else {
resolve({ flag: false });
}
}
);
});
}
return false;
}
/**
* @version 1.0 删除文档
* @param collection 文档名
* @param searchStr 需删除的条件名
* @return flag true为成功 false为失败
*
*/
static async deleteDoc({ collection, searchStr }) {
let db = mongoClient.getCoon();
if (db) {
return await new Promise((resolve, reject) => {
let dbCollection = db.collection(collection);
dbCollection.remove(searchStr, (err, result) => {
if (err) {
log.error('MongoDBUtil:deleteDoc' + err);
reject(err);
}
if (result.result.n > 0) {
resolve({ flag: true });
} else {
resolve({ flag: false });
}
}
);
});
}
return false;
}
}
// mongoClient.createConn().then(
// () => {
// let m = new MongoDBUtil();
// //插入操作示例
// // let user = [{ 'userName': 'zjx6', 'age': 11 }, { 'userName': 'zjx7', 'age': 12 }];
// // m.insertDoc({ collection: 'xmj_users', data: user });
// //查找操作示例
// // let searchStr = {'_id':'59eef0741bd3f0d6255c9362'};
// // m.findDoc({collection:'xmj_user', searchStr});
// //更新操作示例 !!请注意 $set 若不写则为直接覆盖
// // let searchStr = { 'userName': 'zj6' };
// // m.updateDoc({ collection: 'xmj_user', searchStr, updateStr: { $set: { 'age': 22 } } });
// //删除操作示例
// // let searchStr = { 'userName': 'zjx6' };
// // m.deleteDoc({ collection: 'xmj_user', searchStr });
// }
// );
module.exports = { MongoDBUtil, };
/**
* @version 1.0 创建客户端
*
*/
const path = require('path');
const MongoClient = require('mongodb').MongoClient;
const logger = require(path.join(__dirname,'../','../','lib','log.js')).log;
let MongoDBConn = [];
/**
* @version 1.0 mongoclient 客户端管理
*
*/
class MongoClientMannage {
static async createConn(mongoCluster) {
for (let i = 0; i < mongoCluster.length; i++) {
let res = await new Promise(
(resolve, reject) => {
MongoClient.connect(mongoCluster[0].url,
{
server: {
poolSize: 5,
socketOptions: { connectTimeoutMS: 10000 },
auto_reconnect: true
},
replSet: {},
mongos: {}
}, (err, db) => {
if (err) {
logger.error('连接mongo失败:'+mongoCluster[0].url);
reject(err);
} else {
logger.info('连接mongo成功:'+mongoCluster[0].url);
resolve(db);
}
});
}
);
MongoDBConn.push(res);
}
}
/**
* @version 1.0 返回一个可用的mongo数据库连接
*
*/
static getCoon() {
if (MongoDBConn.length == 0) {
return false;
} else {
//返回任一一个连接
return MongoDBConn[Math.floor(Math.random() * MongoDBConn.length)];
}
}
}
module.exports = {MongoClientMannage,};