Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

node应用连接数据库服务器实战 #23

Open
ChenJiaH opened this issue Aug 2, 2019 · 0 comments
Open

node应用连接数据库服务器实战 #23

ChenJiaH opened this issue Aug 2, 2019 · 0 comments
Labels
mongodb mongodb数据库相关 node.js

Comments

@ChenJiaH
Copy link
Owner

ChenJiaH commented Aug 2, 2019

首发于微信公众号《前端成长记》,写于 2017.05.12

背景

最近开发一个公司项目,需要支持外网访问,而公司要求:应用服务器跟数据服务器必须分开,所以才有了应用服务器连接数据服务器这么一说。

本文章适合对mongodb有所涉猎者阅读

Let's go

提前申明

  • 本项目使用的是mongodb服务器,为了简化api,使用的是monk进行连接,当然也可以直接使用原生api进行连接,下面都将做介绍
  • 应用服务器已安装node:v6.10.3,mongodb:v2.2.26,monk:v4.0.0
  • 数据服务器已安装mongodb
  • 除开启等必要操作在命令行执行外,全部在node脚本中执行

如何给mongodb设置权限

为了安全起见,我们一般都会给数据库设置不同权限的用户。

  1. 首先,需要在不开启auth条件下启动数据库,进行mongodb/bin目录
./mongo --dbpath database
  1. 连接上之后,我们开始增加一个账户并配置相应权限
var MongoClient = require('mongodb').MongoClient
MongoClient.connect('mongodb://localhost:27017/database', function(err, db){
  // db为当前连接上的数据库
 
  // Add the new user to the database
  db.addUser('username', 'password', function(err, result) {
    if(result == 1) {
        // 添加成功
        var col = db.get("testcollection");
        col.insert({"test":"name"})
        // 这个时候你会发现数据表testcollection中有了一条数据
    }
  });
})
  1. mongodb使用认证模式连接
./mongo --dbpath database --auth
  1. 查询之前添加的数据
var monk = require("monk");
var db = monk('localhost:27017/database');
var col = db.get("testcollection");
col.find({},{},function(err, docs){
    if(err) {
        console.error(err)
    } else {
        console.log(docs)
    }
})

你会发现报错如下:

uncaught exception: error: {     
    "$err" : "unauthorized db:database lock type:-1 client:127.0.0.1",     
    "code" : 10057
}

不要紧张,这意思就是你没有认证数据库admin,连接时加上密码认证即可。

连接带认证的mongodb数据库

  1. mongodb原生方法
var MongoClient = require('mongodb').MongoClient;
MongoClient.connect('mongodb://localhost:27017/database', function(err, db) {
    // Authenticate using the newly added username
    db.authenticate('username', 'password').then(function(result) {
      if(result == 1) {
        console.log("认证成功")
        // TODO:查询检验
        var col = db.collection("testcollection");
        col.find({},function(err, docs){
            console.log(docs)
            // 你会发现此时可以成功获取到数据了        
        })
      }
    });
  });
});
  1. monk方法

这里遇到个问题,正常代码逻辑如下:

var monk = require("monk");
var db = monk("mongodb://localhost:27017/database");
 
db.authenticate('username', 'password');

结果发现报错:

db.authenticate is not a function

查monk源码manager.js发现连接这一段代码如下:

Manager.prototype.open = function (uri, opts, fn) {
  MongoClient.connect(uri, opts, function (err, db) {
    if (err || !db) {
      this._state = STATE.CLOSED
      this.emit('error-opening', err)
    } else {
      this._state = STATE.OPEN
      this._db = db
      this.emit('open', db)
    }
    if (fn) {
      fn(err, this)
    }
  }.bind(this))
}

是的,你没看错,它是直接连接,没有提供 authenticatecreateUser 等其他方法,心里一片绝望,此时,想解决问题有两种方案:

  • 使用mongodb原生语法,代码量大增且修改量巨大
  • 修改monk源码,增加认证等过程

两种方法感觉都不太合适,正值绝望之时,看见下面的代码

MongoClient.connect('mongodb://username:password@localhost:27017/database');

既然原生支持这种连接,那么monk应该也可以,如果可以,那么便解决了上面的问题了,说做就做。

var monk = require("monk");
var db = monk("mongodb://username:password@localhost:27017/database");
var col = db.collection("testcollection");
col.find({},function(err, docs){
    console.log(docs)
    // 你会发现此时可以成功获取到数据了        
})

Perfect!

进入应用服务器连接数据服务器

  1. 通过之前申请到的权限,进入应用服务器的堡垒机,连接进入应用服务器

  2. 在应用服务器上进行数据库的连接测试

var monk = require("monk");
var db = monk("mongodb://username:password@server:27017/database");

只需要把 usernamepasswordserver 填入上面的字段,即可成功连接数据库服务器。

(完)


本文为原创文章,可能会更新知识点及修正错误,因此转载请保留原出处,方便溯源,避免陈旧错误知识的误导,同时有更好的阅读体验
如果能给您带去些许帮助,欢迎 ⭐️star 或 ✏️ fork
(转载请注明出处:https://chenjiahao.xyz)

@ChenJiaH ChenJiaH added node.js mongodb mongodb数据库相关 labels Aug 2, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
mongodb mongodb数据库相关 node.js
Projects
None yet
Development

No branches or pull requests

1 participant