TypeScript Express tutorial #2.1 mongodb

389 阅读3分钟

prepare for docker

orbstak is free , lightweight, fast docker manage tool. easier to use than docker desktop

  1. go orbstack download orbstack and install
  2. open orbstack then you get docker development environment
  3. go compass download mongo compass and install

prepare for mongodb

solution 1

# create container without auth
docker run --name mongo-docker-27017 -v ~/data/mongodb-data:/data/db -p 27017:27017 -d mongodb/mongodb-community-server:latest

docker exec -it  mongo-docker-27017 mongosh admin

# open mongo db shell and use admin db, create admin user
> db.createUser({user:"admin", pwd:"admin", roles:[{role:"userAdminAnyDatabase", db:"admin"}]});
>db.auth('admin', 'admin')

# ctrl + c twice exit

docker ps

docker remove mongo-docker-27017

# recreate mongo-docker-27017 container use old data

docker run --name mongo-docker-27017 -v ~/data/mongodb-data:/data/db -p 27017:27017  -d mongodb/mongodb-community-server:latest --auth

# login container if needed
docker exec -it mongo mongosh

an intresting docker log

Warning: File MONGO_INITDB_ROOT_USERNAME_FILE is deprecated. Use MONGODB_INITDB_ROOT_USERNAME_FILE instead.
Warning: File MONGO_INITDB_ROOT_PASSWORD_FILE is deprecated. Use MONGODB_INITDB_ROOT_PASSWORD_FILE instead

# mean that but i have not try
db.createUser({user:"admin", pwd:"admin", roles:[{role:"userAdminAnyDatabase", db:"admin"}]});

role权限主要有

role作用
Read允许用户读取指定数据库
readWrite允许用户读写指定数据库
dbAdmin允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
userAdmin允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
clusterAdmin只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
readAnyDatabase只在admin数据库中可用,赋予用户所有数据库的读权限
readWriteAnyDatabase只在admin数据库中可用,赋予用户所有数据库的读写权限
userAdminAnyDatabase只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
dbAdminAnyDatabase只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
root只在admin数据库中可用。超级账号,超级权限

since some action can only done before authed.

solution 2

# create mongo conf
touch ~/data/mongodb-data/configdb/mongo.conf

mongo.conf

www.mongodb.com/docs/manual…

systemLog:
  destination: file
  path: /var/log/mongodb/mongod.log
  logAppend: true
storage:
  dbPath: /data/db
net:
  port: 27017
  bindIp: 0.0.0.0
# security:
  #authorization: enabled
  
# https://yijiebuyi.com/blog/397625f0f98c87bdbc0fd6c792ee1ca3.html



docker run --name mongo-docker-27017 -v ~/data/mongodb-data/data:/data/db -v ~/data/mongodb-data/configdb/mongo.conf:/data/configdb/mongo.conf -v ~/data/mongodb-data/log:/var/log/mongodb -p 27017:27017 -d mongodb/mongodb-community-server:latest -f /data/configdb/mongo.conf

# mongodb container has create and run 

# login mongodb and create a root user
docker exec -it  mongo-docker-27017 mongosh admin


db.createUser({user:"admin", pwd:"admin", roles:[{role:"userAdminAnyDatabase", db:"admin"}]});

exit

docker stop mongo-docker-27017

edit ~/data/mongodb-data/configdb/mongo.conf uncoument auth config

change

# security:
  #authorization: enabled

to

security:
  authorization: enabled

then restart contaner

docker start mongo-docker-27017

then you have a local docker mongodb develop environment, with or without auth as you needed.

connect to monogodb

create a user for the tutorial

docker exec -it  mongo-docker-27017 mongosh admin

db.createUser({user:"tutorial", pwd:"tutorial", roles:[{role:"readWrite", db:"tutorial"}]});

pnpm i dotenv

add a .env to the root directory of project

MONGO_USER=tutorial
MONGO_PASSWORD=tutorial
MONGO_DB_NAME=tutorial
# mongodb+srv://username:password@ip:port/databasename
MONGO_PATH=localhost
PORT=5000

use it in server.ts, just for a little test, will refactor later.

import  express from 'express';

import * as mongoose from 'mongoose';
import 'dotenv/config';
 
const {
  MONGO_USER,
  MONGO_PASSWORD,
  MONGO_PATH,
  MONGO_DB_NAME,
} = process.env;

const url = `mongodb://${MONGO_USER}:${MONGO_PASSWORD}@${MONGO_PATH}/${MONGO_DB_NAME}?authSource=admin`;

console.log(url);

mongoose.connect(url);

const CatSchema = new mongoose.Schema({
  name: String
})
const Cat = mongoose.model('Cat', CatSchema);

const kitty = new Cat({ name: 'Zildjian' });
kitty.save().then(() => console.log('meow'));
 
const app = express();
 
app.get('/', (request, response) => {
  response.send('Hello world!');
});
 
app.listen(5001, () => {
  console.log('Example app listening on port 5001!');
});

ref: