Mongodb Can';t solve MongoParserError:连接字符串无效
我无法解决这个错误 首先我试过这个Mongodb Can';t solve MongoParserError:连接字符串无效,mongodb,docker,mongoose,docker-compose,Mongodb,Docker,Mongoose,Docker Compose,我无法解决这个错误 首先我试过这个 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
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
谁能告诉我我做错了什么 通过查看,看起来任何机密都会作为装载在/run/secrets/SECRET\u 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});
/db\u user.txt
和/db\u password.txt
的内容是什么?有斜杠吗?我在这两个文件中没有任何特殊字符。如果用户名或密码包括@
,:
,/
或%
,请使用上面的注释为我解答(密码中有一个/)。要应用编码,可以使用encodeURIComponent()。