Could not connect to DynamoDB Local (ECONNREFUSED)
TL;DR — 在你的客户端拨号的地方没有任何东西在监听。确认 DynamoDB Local 确实运行在你预期的端口上,并且你客户端的 endpoint 指向 http://localhost:8000——而不是真实 AWS。
含义
Error: connect ECONNREFUSED 127.0.0.1:8000TCP 连接被拒绝:模拟器没有在那个主机/端口上运行,或者客户端指向了一个没有任何东西在监听的地方。
为什么会发生
- DynamoDB Local 未运行——它从未启动、崩溃了,或被关闭了(参见启动进程错误)。
- 端口错误——Local 在
8000上,而客户端拨的是8080(或者容器映射了一个不同的主机端口)。 - 未设置
endpoint——没有它,SDK 会与_真实_ AWS 对话,而非 localhost(随后表现为认证/区域错误,或者如果你覆盖了主机则表现为被拒绝)。 - Docker 网络——从另一个容器看,
localhost是那个容器,而不是主机。使用服务名/主机网关。 localhost与127.0.0.1的解析怪癖(IPv6::1)。
Typical setups
| 设置 | 端点 | 问题 |
|---|---|---|
| Docker 默认 | http://localhost:8000 | 容器必须发布 -p 8000:8000 |
| 自定义端口 | http://localhost:8001 | 匹配罐子上的-port 8001和**客户端 |
| 撰写服务 | http://dynamodb:8000 | 来自另一个容器 - 不是 localhost |
| 错误地真实AWS | https://dynamodb.<region>.amazonaws.com | 当你指的是云时,请删除 endpoint |
在 Windows 上,WSL 和主机有时对于哪个进程拥有所有权存在分歧
localhost:8000 — 如果 curl 在 WSL 中工作,但主机上的 Node 得到
ECONNREFUSED,将主机客户端明确指向127.0.0.1或运行 Local
客户端运行的地方。
DynoTable 在本地配置文件上的 Test Connection 是最快的检查你配置的端点上有一些答案 - 它失败并显示相同的信息当本地关闭时拒绝套接字。
如何修复
- 确认它在监听:
curl http://localhost:8000 # DynamoDB Local returns a small response lsof -i :8000 # something should own the port - 在客户端上显式设置端点:
import {DynamoDBClient} from '@aws-sdk/client-dynamodb'; const client = new DynamoDBClient({ region: 'local', endpoint: 'http://localhost:8000', credentials: {accessKeyId: 'local', secretAccessKey: 'local'} }); - 匹配模拟器实际绑定的端口(以及 Docker 的
-p host:container映射)。 - 跨容器? 使用容器/服务名(例如
http://dynamodb-local:8000)或host.docker.internal,而不是localhost(host.docker.internal在 Docker Desktop 中自动解析;在 Linux Docker Engine 上添加--add-host host.docker.internal:host-gateway)。
DynoTable 工作台
Install DynoTable,然后 Settings → Profiles → 添加 Profile
端点http://localhost:8000。按⌘P切换到本地配置文件一旦curl http://localhost:8000成功。凭证点应保持绿色当本地启动时;如果因连接错误而变为红色,则端口或端点配置文件与模拟器侦听的位置不匹配。使用
DynamoDB JSON converter 之后加载夹具本地可达。如果 curl http://localhost:8000 失败,则模拟器未运行 — 启动 Docker
或者先装罐子(Unable to start DynamoDB Local process)。当端口错误但有东西正在侦听时,你可能会看到一般 HTTP 错误而不是 ECONNREFUSED;将配置文件端点与任何lsof -i :8000匹配报告。指南:Connect to DynamoDB Local & LocalStack。
相关错误
- Unable to start DynamoDB Local process
- 配置中缺少 region
- 学习:Running DynamoDB Local · Connecting to DynamoDB Local / LocalStack
来源
- Deploying DynamoDB locally on your computer — AWS DynamoDB Developer Guide(默认端口 8000、启动命令、Docker 运行/编写示例)
- DynamoDB local usage notes — AWS DynamoDB Developer Guide(本地端点
http://localhost:8000;SDK 需要访问密钥 + 区域值) - amazon/dynamodb-local — Docker Hub(官方图片,
docker run -p 8000:8000 amazon/dynamodb-local) - ⟦2⟧ — Docker CLI reference(
host.docker.internal/host-gateway用于容器到主机的连接)