NodeJS + MongoDB 建立长链接及后续请求方法

C 2022-3-4 1756

网上基本没有相关教程,要么就是错的。国外的讲解也不是很全面,我自己搞了一个给大家参考。
 
// 首先建立数据库连接,这里的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,相对好用,是前者变体。
最新回复 (8)
  • 指南Nan 2022-3-4
    2

    你在试图教会我

  • C 2022-3-4
    3
    Bug2021 你在试图教会我

    每天看一遍就误了

  • FANAYUN 2022-3-4
    4

    我不知道,一般我喜欢websocket

  • C 2022-3-4
    5
    FANAYUN 我不知道,一般我喜欢websocket

    连接数过多,访问量一大撑不住的。我准备先把程序框架大致写出来,后续再做性能优化。考虑的技术就是多线程/协程、同类请求多路复用这些。

  • FANAYUN 2022-3-5
    6
    C 连接数过多,访问量一大撑不住的。我准备先把程序框架大致写出来,后续再做性能优化。考虑的技术就是多线程/协程、同类请求多路复用这些。

    长链接再怎么玩都扛不住大访问的,几千人还行,多了再怎么都不行了,还是得上websocket。

  • C 2022-3-5
    7
    FANAYUN 长链接再怎么玩都扛不住大访问的,几千人还行,多了再怎么都不行了,还是得上websocket。

    你那是TCP长链接,数据库长连接无所谓的

  • FANAYUN 2022-3-5
    8
    C 你那是TCP长链接,数据库长连接无所谓的

    node.js和数据库长连接是正常的,php通过协程框架也可以实现和数据库的长连接,数据库的瓶颈就是IO,客户端直接长连接数据库,好像多了也不行吧,和TCP一个样,都得websocket。

  • C 2022-3-5
    9
    FANAYUN node.js和数据库长连接是正常的,php通过协程框架也可以实现和数据库的长连接,数据库的瓶颈就是IO,客户端直接长连接数据库,好像多了也不行吧,和TCP一个样,都得websocket。

    websocket建立在tcp基础上,这俩一样的。

    至于mongodb,远程采用tcp,本地的话直接走socks。

    • 屌丝论坛
      10