Node.js使用nano连接docker-compose部署的CouchDB报连接错误如何解决?
错误原因
- 核心问题为容器网络地址配置错误。Docker Compose 会为所有服务创建独立的内部网络,每个容器的
127.0.0.1指向自身而非宿主机,你在 Node 服务代码中写的127.0.0.1:5984会尝试访问 Node 容器自身的5984端口,而 CouchDB 服务运行在独立的couchdb1容器内,自然无法连通。宿主机上执行curl正常是因为你做了端口映射,宿主机的5984端口绑定了CouchDB容器的5984端口,和容器内部的网络访问逻辑完全不同。 - 次要常见原因为服务启动时序问题。
depends_on仅控制容器启动顺序,不会等待CouchDB服务完全初始化完成就启动Node服务,此时CouchDB还未就绪,连接请求也会失败。 - 可能的附加问题为目标数据库未初始化。如果
posts数据库未提前创建,调用插入接口也会抛出连接类错误。
修复方案
1. 修改数据库连接地址
把server.js中的nano初始化代码修改为使用Docker Compose内部服务名作为主机地址:
// 原代码 // var nano = require('nano')('http://admin:admin@127.0.0.1:5984'); // 修改后 var nano = require('nano')('http://admin:admin@couchdb1:5984');
Docker Compose内部的DNS服务会自动将服务名couchdb1解析为CouchDB容器的内部IP。
2. 调整启动时序,等待CouchDB就绪
修改docker-compose.yml,给CouchDB服务添加健康检查,同时配置Node服务等待CouchDB健康后再启动:
version: '3' services: node1: build: ./s1 depends_on: couchdb1: condition: service_healthy container_name: s1a4 ports: - "81:8080" couchdb1: image: couchdb:3.2.0 container_name: cdb1 ports: - "5984:5984" environment: COUCHDB_USER: admin COUCHDB_PASSWORD: admin # 新增健康检查配置 healthcheck: test: ["CMD", "curl", "-f", "http://admin:admin@localhost:5984/_up"] interval: 2s timeout: 5s retries: 10
3. (可选)添加数据库初始化逻辑
如果不能保证提前创建posts数据库,可以在Node代码中新增数据库存在性检查和创建逻辑:
// 在nano初始化后添加 let posts; async function initDb() { try { await nano.db.get('posts') } catch (e) { if (e.statusCode === 404) { await nano.db.create('posts') } else { throw e } } posts = nano.use('posts') } // 先执行初始化再执行插入逻辑 async function asyncCall() { await initDb() const response = await posts.insert({_id: "001"}, 'rabbit') return response } asyncCall();
4. 生效配置
执行以下命令重新启动服务即可:
docker-compose down -v docker-compose up --build
内容的提问来源于stack exchange,提问作者ConnerWithAnE
相关产品推荐
相关产品推荐

