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
相关产品推荐
相关产品推荐

