我看到类似的帖子,但没有一个能帮助我解决我的问题。
按照从头开始构建 MERN 应用程序的 Udemy 教程,我陷入了 mongoose 连接。
这是我的index.js代码:
const express = require("express");
const mongoose = require("mongoose");
const app = express();
app.use(express.json());
app.listen(5000, () => console.log("Server started on port 5000"));
app.use("/snippet", require("./routers/snippetRouter"));
mongoose.connect("mongodb+srv://snippetUser:_password_@
snippet-manager.sometext.mongodb.net/main?retryWrites=
true&w=majority", {
useNewUrlParser: true,
useUnifiedTopology: true
}, (err) => {
if (err) return console.log("error here " + err);
console.log("Connected to MongoDB");
});
这是我收到的错误:
Server started on port 5000
error here MongooseServerSelectionError: Could not connect to any
servers in your MongoDB Atlas cluster. One common reason is
that you're trying to access the database from an IP that isn't
whitelisted. Make sure your current IP address is on your Atlas
cluster's IP whitelist:
https://docs.atlas.mongodb.com/security-whitelist/
如上所述,我看到与未列入白名单的 IP 相关的类似错误。
但是,在我的mongoDB帐户中,似乎我的IP已经列入白名单:
在上面的屏幕截图中,空白部分是我的 IP 所在位置(就在“包括您当前的 IP 地址”之前)。
既然我的IP被列在那里,这是否意味着我的IP已被列入白名单?
如果没有,如何将我的 IP 列入白名单?
这是我在其他地方留下的答案。希望它可以帮助遇到此问题的人:
此脚本将根据我的要点
保持最新mongo atlas 提供了对托管 mongo DB 的价格合理的访问。托管容器的 CSP 对其托管的 mongo DB 收费过高。他们都建议设置一个不安全的 CIDR (
0.0.0.0/0
) 以允许容器访问集群。这显然是荒谬的。
这个入口点脚本是维持最低特权访问的外科手术。仅服务当前托管的 IP 地址被列入白名单。
Dockerfile
exec "$@"
,因为这仅适用于容器使用 mongo atlas 项目 IP 访问列表端点
创建白名单条目后,服务会休眠 60 秒以等待 atlas 将访问传播到集群
设置
MONGO_ATLAS_API_PK
)和秘钥(MONGO_ATLAS_API_SK
)MONGO_ATLAS_API_PROJECT_ID
)在容器服务的env中提供以下值
SERVICE_NAME
:用于创建/更新(删除旧的)白名单条目的唯一名称MONGO_ATLAS_API_PK
:步骤3MONGO_ATLAS_API_SK
:步骤3MONGO_ATLAS_API_PROJECT_ID
:步骤4# alpine / apk
apk update \
&& apk add --no-cache \
bash \
curl \
jq
# ubuntu / apt
export DEBIAN_FRONTEND=noninteractive \
&& apt-get update \
&& apt-get -y install \
bash \
curl \
jq
#!/usr/bin/env bash
# -- ENV -- #
# these must be available to the container service at runtime
#
# SERVICE_NAME
#
# MONGO_ATLAS_API_PK
# MONGO_ATLAS_API_SK
# MONGO_ATLAS_API_PROJECT_ID
#
# -- ENV -- #
set -e
mongo_api_base_url='https://cloud.mongodb.com/api/atlas/v1.0'
check_for_deps() {
deps=(
bash
curl
jq
)
for dep in "${deps[@]}"; do
if [ ! "$(command -v $dep)" ]
then
echo "dependency [$dep] not found. exiting"
exit 1
fi
done
}
make_mongo_api_request() {
local request_method="$1"
local request_url="$2"
local data="$3"
curl -s \
--user "$MONGO_ATLAS_API_PK:$MONGO_ATLAS_API_SK" --digest \
--header "Accept: application/json" \
--header "Content-Type: application/json" \
--request "$request_method" "$request_url" \
--data "$data"
}
get_access_list_endpoint() {
echo -n "$mongo_api_base_url/groups/$MONGO_ATLAS_API_PROJECT_ID/accessList"
}
get_service_ip() {
echo -n "$(curl https://ipinfo.io/ip -s)"
}
get_previous_service_ip() {
local access_list_endpoint=`get_access_list_endpoint`
local previous_ip=`make_mongo_api_request 'GET' "$access_list_endpoint" \
| jq --arg SERVICE_NAME "$SERVICE_NAME" -r \
'.results[]? as $results | $results.comment | if test("\\[\($SERVICE_NAME)\\]") then $results.ipAddress else empty end'`
echo "$previous_ip"
}
whitelist_service_ip() {
local current_service_ip="$1"
local comment="Hosted IP of [$SERVICE_NAME] [set@$(date +%s)]"
if (( "${#comment}" > 80 )); then
echo "comment field value will be above 80 char limit: \"$comment\""
echo "comment would be too long due to length of service name [$SERVICE_NAME] [${#SERVICE_NAME}]"
echo "change comment format or service name then retry. exiting to avoid mongo API failure"
exit 1
fi
echo "whitelisting service IP [$current_service_ip] with comment value: \"$comment\""
response=`make_mongo_api_request \
'POST' \
"$(get_access_list_endpoint)?pretty=true" \
"[
{
\"comment\" : \"$comment\",
\"ipAddress\": \"$current_service_ip\"
}
]" \
| jq -r 'if .error then . else empty end'`
if [[ -n "$response" ]];
then
echo 'API error whitelisting service'
echo "$response"
exit 1
else
echo "whitelist request successful"
echo "waiting 60s for whitelist to propagate to cluster"
sleep 60s
fi
}
delete_previous_service_ip() {
local previous_service_ip="$1"
echo "deleting previous service IP address of [$SERVICE_NAME]"
make_mongo_api_request \
'DELETE' \
"$(get_access_list_endpoint)/$previous_service_ip"
}
set_mongo_whitelist_for_service_ip() {
local current_service_ip=`get_service_ip`
local previous_service_ip=`get_previous_service_ip`
if [[ -z "$previous_service_ip" ]]; then
echo "service [$SERVICE_NAME] has not yet been whitelisted"
whitelist_service_ip "$current_service_ip"
elif [[ "$current_service_ip" == "$previous_service_ip" ]]; then
echo "service [$SERVICE_NAME] IP has not changed"
else
echo "service [$SERVICE_NAME] IP has changed from [$previous_service_ip] to [$current_service_ip]"
delete_previous_service_ip "$previous_service_ip"
whitelist_service_ip "$current_service_ip"
fi
}
check_for_deps
set_mongo_whitelist_for_service_ip
# run CMD
exec "$@"
如果您使用免费的 MongoDB Atlas,请确保您的集群没有意外暂停
删除您当前的 IP 地址并重新添加
转到您的 MongoDB Atlas 帐户
登录后转到以下网址 https://cloud.mongodb.com/v2/your_cluster_id#/security/network/accessList
然后在IP访问列表选项卡
中添加IP然后点击 + 添加 IP 地址
因此您可以从该特定 IP 访问数据库。
==================== 或 ============================== =
进入网络访问
然后在IP访问列表选项卡
中添加IP然后点击 + 添加 IP 地址
因此您可以从该特定 IP 访问数据库。
您应该在连接链接中输入集群密码--
mongodb+srv://snippetUser:_password_@
snippet-manager.sometext.mongodb.net/main?retryWrites=true&w=majority
通过删除 password 字段
输入集群密码检查您的IP白名单:
转到 MongoDB Atlas 仪表板。 导航到您的集群并单击左侧边栏中的“网络访问”。 确保您当前的IP地址已添加到IP白名单中。如果没有,您需要添加它。
将您的IP地址添加到白名单:
单击“添加 IP 地址”按钮。 添加运行 Node.js 服务器的计算机的 IP 地址。 如果您在本地运行服务器,您可以使用“我的 IP 是什么”等服务来获取您当前的公共 IP 地址。
更新连接字符串:
修改 Node.js 代码中的 MongoDB 连接字符串以使用您的实际用户名、密码和数据库名称。替换为您的实际密码。 确保连接字符串中没有换行符。
mongoose.connect("mongodb+srv://snippetUser:<password>@snippet-manager.sometext.mongodb.net/main?retryWrites=true&w=majority", {
useNewUrlParser: true,
useUnifiedTopology: true
}, (err) => {
if (err) return console.log("error here " + err);
console.log("Connected to MongoDB");
});
确保替换为您的实际密码。
重试: 进行这些更改后,重新启动 Node.js 服务器并查看问题是否解决。