【问题标题】:Can't solve MongoParseError: Invalid connection string无法解决 MongoParseError: Invalid connection string
【发布时间】:2019-05-30 07:53:37
【问题描述】:

我无法解决 MongoParseError。

首先我尝试过这个

mongoose.connect(`mongodb://${process.env.DB_USER}:${process.env.DB_PASSWORD}@db:27017/${process.env.DB_NAME}`, {useNewUrlParser: true});

让我陷入了这个错误

MongoParseError: Unescaped slash in userinfo section

然后我逃脱了所有的斜线

mongoose.connect(`mongodb:\\/\\/${process.env.DB_USER}:${process.env.DB_PASSWORD}@db:27017\\/${process.env.DB_NAME}`, {useNewUrlParser: true});

我最终遇到了这个我无法解决的错误

MongoParseError: Invalid connection string

这是我的 index.js

'use strict';

const mongoose = require('mongoose');
mongoose.connect(`mongodb:\\/\\/${process.env.DB_USER}:${process.env.DB_PASSWORD}@db:27017\\/${process.env.DB_NAME}`, {useNewUrlParser: true});

var db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function() {
  console.log('ok');
});

const express = require('express');

// Constants
const PORT = 8080;
const HOST = 'localhost';


var kittySchema = new mongoose.Schema({
  name: String
});

var Kitten = mongoose.model('Kitten', kittySchema);

var silence = new Kitten({ name: 'Test1234' });


// App
const app = express();
app.get('/', (req, res) => {
  res.send(silence.name);
});

app.listen(PORT);
console.log(`Running on http://${HOST}:${PORT}`);

这里是 docker-compose.yml

version: '3.7'
services:
  web:
    build: .
    command: npm start
    volumes:
      - ./src:/usr/app/
      - ./src/node_modules:/usr/app/node_modules
    ports:
      - 80:8080
    environment:
      DB_NAME: websitedb
      DB_USER: /run/secrets/db_user
      DB_PASSWORD: /run/secrets/db_password
    secrets:
      - db_user
      - db_password
  db:
    image: mongo:latest
    volumes:
      - ./mongo-init.js:/docker-entrypoint-initdb.d/mongo-init.js:ro
    ports:
      - "27017:27017"
    environment:
      MONGO_INITDB_DATABASE: websitedb
      MONGO_INITDB_ROOT_USERNAME_FILE: /run/secrets/db_user
      MONGO_INITDB_ROOT_PASSWORD_FILE: /run/secrets/db_password
    secrets:
      - db_user
      - db_password
volumes:
  mongo:
secrets:
  db_user:
    file: ./db_user.txt
  db_password:
    file: ./db_password.txt

谁能告诉我我做错了什么?

【问题讨论】:

  • ./db_user.txt./db_password.txt的内容是什么?里面有斜线吗?
  • 我在这两个文件中没有任何特殊字符。
  • 如果用户名或密码包含@:/%,则使用percent encoding
  • 以上评论为我解决了(我的密码中有 /)。要应用编码,您可以使用 encodeURIComponent()。

标签: mongodb docker mongoose docker-compose


【解决方案1】:

查看guide on managing secrets in docker compose,看起来任何秘密都作为挂载在/run/secrets/SECRET_NAME中的文件传递到容器中,建议是将这个文件的路径作为环境变量传递,然后将文件读入你的应用:

部署时,Docker 会在服务中的 /run/secrets/ 下挂载一个文件。这些文件永远不会保存在磁盘中,而是在内存中进行管理。

每个服务都使用环境变量来指定服务应在何处查找该秘密数据。

您已将这些秘密的路径传递为process.env.DB_USER,但要获得实际的秘密,您需要阅读文件:

const fs = require('fs');
const mongoose = require('mongoose');

let dbUser = fs.readFileSync(process.env.DB_USER);
let dbPassword = fs.readFileSync(process.env.DB_PASSWORD);

mongoose.connect(`mongodb://${dbUser}:${dbPassword}@db:27017/${process.env.DB_NAME}`, {useNewUrlParser: true});

【讨论】:

    猜你喜欢
    • 2020-11-25
    • 2016-03-30
    • 2022-11-16
    • 1970-01-01
    • 2021-04-29
    • 1970-01-01
    • 2013-04-14
    • 1970-01-01
    • 2019-08-16
    相关资源
    最近更新 更多