
# Node.js 示例
#### 操作场景
DDS支持通过Node.js语言接口来操作数据，通过Node.js连接实例的方式有开启SSL认证连接和关闭SSL认证连接两种，其中开启SSL证书连接加密功能，具有更高的安全性。
DDS新实例默认关闭SSL数据加密，开启SSL请参考[开启SSL](https://support.huaweicloud.com/usermanual-dds/dds_03_0074.html#section1)。
本章节主要介绍使用Node.js语言连接集群实例的方法。
#### 前提条件
1. 连接数据库的弹性云服务器必须和DDS实例之间网络互通，可以使用curl命令连接DDS实例服务端的IP和端口号，测试网络连通性。 curl ip:port
   返回"It looks like you are trying to access MongoDB over HTTP on the native driver port."，说明网络互通。
   
2. 如果开启SSL，需要在界面上下载根证书，并上传到弹性云服务器。
 
#### 环境配置及驱动获取
1. 确保您的环境已安装Node.js，获取地址请参考 [Node.js 官网](https://nodejs.org/)。
2. 初始化项目，创建项目目录并进入，执行初始化命令生成package.json文件：
   ```
   mkdir your_project
   cd your_project
   npm init -y
   ```
   
3. 安装驱动程序：
   ```
   npm install mongodb@3.7.4
   ```
   
 
#### 开启和关闭SSL安全连接
在 your_project 目录中，为应用程序创建一个名为index.js的文件，将示例代码复制到index.js中。
- [SSL关闭]
  ```
  const { MongoClient } = require('mongodb');
  const uri = 'mongodb://rwuser:rwuserpassword@ip:port/{mydb}?authSource=admin';
  const client = new MongoClient(uri, {
      serverSelectionTimeoutMS: 5000, // 5 秒内找不到可用节点就报错
      connectTimeoutMS: 5000,         // 单次 TCP 连接 5 秒超时
      socketTimeoutMS: 10000          // socket 空闲 10 秒超时
  });
  async function main() {
      try {
          await client.connect();
          console.log('成功连接到 MongoDB');
          // 测试连接
          const result = await client.db('admin').command({ ping: 1 });
          console.log('Ping 结果：', result);
          // 示例：读取数据
          const db = client.db('test');
          const collection = db.collection('users');
          const doc = await collection.findOne({});
          console.log('查到的第一条文档：', doc);
      } catch (err) {
          console.error('连接或操作失败：', err);
      } finally {
          await client.close();
      }
  }
  main().catch(console.dir);
  ```
- [SSL 开启]
  ```
  const { MongoClient } = require('mongodb');
  const uri = 'mongodb://rwuser:rwuserpassword@ip:port/{mydb}?authSource=admin';
  const client = new MongoClient(uri, {
      serverSelectionTimeoutMS: 5000, // 5 秒内找不到可用节点就报错
      connectTimeoutMS: 5000,         // 单次 TCP 连接 5 秒超时
      socketTimeoutMS: 10000，        // socket 空闲 10 秒超时
      tls: true,
      tlsCAFile:'./ca.crt',           // 证书地址
      tlsAllowInvalidHostnames: true
  });
  async function main() {
      try {
          await client.connect();
          console.log('成功连接到 MongoDB');
          // 测试连接
          const result = await client.db('admin').command({ ping: 1 });
          console.log('Ping 结果：', result);
          // 示例：读取数据
          const db = client.db('test');
          const collection = db.collection('users');
          const doc = await collection.findOne({});
          console.log('查到的第一条文档：', doc);
      } catch (err) {
          console.error('连接或操作失败：', err);
      } finally {
          await client.close();
      }
  }
  main().catch(console.dir);
  ```
#### 相关文档
[设置SSL数据加密](https://support.huaweicloud.com/usermanual-dds/dds_03_0074.html)
[通过程序代码连接集群实例](https://support.huaweicloud.com/usermanual-dds/dds_03_0321.html)
