You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Haskell MongoDB驱动是否支持SRV域名?连接问题求助

解决Haskell mongodb驱动连接DigitalOcean MongoDB SRV实例的问题

问题根源

你使用的mongodb-haskell驱动不支持MongoDB SRV连接字符串。官方示例中的host函数仅能处理普通IP/域名,无法解析SRV记录对应的集群节点信息,因此会抛出Network.BSD.getHostByName: does not exist错误。

解决方案

1. 手动解析SRV记录获取集群节点

先通过DNS工具解析SRV记录,获取实际的MongoDB集群节点地址:

dig _mongodb._tcp.content-mongodb-e9fasfs1.mongo.ondigitalocean.com SRV

执行后会得到类似结果:

_mongodb._tcp.content-mongodb-e9fasfs1.mongo.ondigitalocean.com. 300 IN SRV 0 10 27017 content-mongodb-e9fasfs1-0.mongo.ondigitalocean.com.
_mongodb._tcp.content-mongodb-e9fasfs1.mongo.ondigitalocean.com. 300 IN SRV 0 10 27017 content-mongodb-e9fasfs1-1.mongo.ondigitalocean.com.

提取其中的主机地址(如content-mongodb-e9fasfs1-0.mongo.ondigitalocean.com)和端口(默认27017)。

2. 配置驱动连接集群并启用TLS

使用驱动的副本集连接方式,同时配置TLS和认证参数:

import Database.MongoDB
import Database.MongoDB.SSL (connectSSL)
import Network.Socket (PortNumber(..))

main :: IO ()
main = do
    -- 配置集群节点(替换为解析得到的实际节点)
    let nodes = [ Host "content-mongodb-e9fasfs1-0.mongo.ondigitalocean.com" (PortNumber 27017)
                , Host "content-mongodb-e9fasfs1-1.mongo.ondigitalocean.com" (PortNumber 27017)
                ]
    -- 启用TLS连接
    pipe <- connectSSL (readPreference ReplicaSetOk) nodes
    -- 认证(替换为你的密码)
    authenticate "admin" (Username "doadmin") (Password "<replace-with-your-password>") pipe
    -- 执行操作(示例:查询test集合)
    res <- access pipe master "admin" $ find (select [] "test") >>= drainCursor
    print res
    close pipe

3. 自动解析SRV记录(进阶)

如果需要动态解析SRV记录,可使用Haskell的DNS库(如dns)实现自动解析:

import Network.DNS.Lookup
import Network.DNS.Resolver

resolveSRV :: IO [Host]
resolveSRV = do
    res <- makeResolvSeed defaultResolvConf
    withResolver res $ \r -> do
        srvRecords <- lookupSRV r "_mongodb._tcp.content-mongodb-e9fasfs1.mongo.ondigitalocean.com"
        return $ map (\srv -> Host (srvTarget srv) (PortNumber $ fromIntegral $ srvPort srv)) srvRecords

然后在主函数中调用resolveSRV获取节点列表,再进行连接。

替代方案

如果手动解析过于繁琐,可考虑使用支持SRV连接的Haskell MongoDB驱动分支或第三方库,但需注意版本兼容性。

内容的提问来源于stack exchange,提问作者Mattmmmmm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 03:25:58