首页 > 解决方案 > 我应该如何连接并将我的本地 mongoose db 移动到 mongodb 云图集?

问题描述

当我启动我的服务器时,显示如下错误:


Error in DB connection : Error: queryTxt ETIMEOUT yky-api-ajgvf.mongodb.net  

为了解决这个问题,我多次尝试正常工作。我什至还不能在 heroku 上正确部署我的项目。我非常喜欢 nodejs,但现在我只想暂时放弃继续学习 nodejs。

如果可能的话,有人帮我解决我的问题。我是学习 Node.Js 的人。已经有四五个月了。在我决定学习 PHP 之前,但现在我仍在尝试学习 nodejs。

我是新手。:)

这是我的小项目中的配置数据库代码。

const mongoose = require('mongoose')
const log = console.log

mongoose.connect('mongodb+srv://chanlay:chanlay123@yky-api-ajgvf.mongodb.net/yky-blog-api?retryWrites=true&w=majority', {
    useNewUrlParser: true
}, (err) => { 
    if (!err) {
        log('MongoDB Connection Succeeded.')
    } else {
        log('Error in DB connection : ' + err)
    }
});

require('../models/posts')

标签: node.jsmongodbexpressmongooseconfigure

解决方案


mongoose.connect()看起来像这样(文档参考):

mongoose.connect(uri, options, function(error) {
  // Check error in initial connection. There is no 2nd param to the callback.
});

// Or using promises
mongoose.connect(uri, options).then(
  () => { /** ready to use. The `mongoose.connect()` promise resolves to mongoose instance. */ },
  err => { /** handle initial connection error */ }
); 

在进一步演示之前,首先,你的这个块是错误的:

if (!err) {
        log('MongoDB Connection Succeeded.')
    } 

错误处理不是这样工作的,这种情况永远不会发生,因为当没有错误时,没有理由调用错误回调函数来检查这种情况。

而是使用.then()块,因为成功的连接会返回一个 Promise:

mongoose.connect(uri, options).then(
  () => { console.log('MongoDB Connection Succeeded.') },
  err => { console.log(err) }
); 

// OR use .catch() after .then()

mongoose.connect(uri, options).then(() => console.log('MongoDB Connection Succeeded.')).catch( err => console.log(err))


您的答案:设置socketTimeoutMS为 60000 或 90000。
如果仍然不起作用,请添加connectTimeoutMS=90000reconnectTries=1000to options


声明一个名为的新变量options(名称是任意的,但最好遵循约定),然后把你的useNewUrlParser: true也放在那里(参考):

const options = {
   useNewUrlParser: true,
   socketTimeoutMS: 60000 //or 90000
 }

提示:您还可以将连接字符串中的驱动程序选项指定为 URI 的查询字符串部分中的参数(参考):

{main-url}?socketTimeoutMS=90000, 那是:

const uri = mongodb+srv://chanlay:chanlay123@yky-api-ajgvf.mongodb.net/yky-blog-api?retryWrites=true&w=majority?socketTimeoutMS=90000

但坚持使用options变量,因为它更干净、更易读且更易于维护(否则你会将所有内容都放在一个字符串中,这会让你更难阅读和调试)。

请通过在我的回答中留下评论作为反馈或报告持续错误来让我知道。


推荐阅读