NodeJS + MongoDB 建立长链接及后续请求方法
网上基本没有相关教程,要么就是错的。国外的讲解也不是很全面,我自己搞了一个给大家参考。
// 首先建立数据库连接,这里的MongoClient.connect()返回的是一个Promise对象,成功则把链接返回给Db对象。
const Db = MongoClient.connect(DBLINK).then(Db => { return Db.db(DBNAME); });
// 在建立连接之后可以在这里获取一些配置,给变量初始化,只在应用启动时读取一次。
Db.then(Db => Db.collection('a').find({ _id: ObjectId('621ddd7446f6073fc0cfa58a') }).toArray(function (err, out) {
if (err) throw err;
console.log(out);
}))
// 此处是用户每次请求时建立连接的过程,相当于一个async监听器,监听到请求后执行里面的东西。
Http.createServer(async (request, response) => {
// 因为上面的Db是Promise对象,因此这里要await等该连接调取后再执行,注意这里是从内存调取,不是重连。
let dbc = await Db;
// 执行数据库查询,返回结果数组。
let out = await dbc.collection('w').find({ _id: ObjectId('621ddd7446f6073fc0cfa58a') }).toArray();
console.log(out);
// 也可以把上面过程放入try...catch...finally,以捕获错误进行处置。
}
至于上面为何有的是.then而有的是await,其实这俩是一个东西,都是Promise对象的用法。只是NodeJS全局流程不是async,因此无法使用await而只能用.then。
Promise.then(done=>{},fail=>{})
可以在任何地方使用。
成功后调用done后大括号内代码,传入参数是done。
失败后调用fail后大括号内代码,传入参数是fail。
await Promise
必须包裹在async function之中。
可以用try{}catch(fail){}finally{}捕获异常。
语法更接近Java,相对好用,是前者变体。