我应该如何连接本地猫鼬数据库并将其移动到 mongodb 云图集?

How should I connect and move my local mongoose db to mongodb cloud atlas?

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


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

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

如果可能的话,有人帮我解决我的问题。我是正在学习的Node.Js。已经有四五个月了。之前决定学leranPHP,现在还在努力学习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')

mongoose.connect() 可以像这样 (docs reference):

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()块,作为一个成功的连接returns一个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=1000 也添加到 options


声明一个名为options的新变量(这个名字是任意的,但最好遵循惯例),你把你的useNewUrlParser: true也放在那里(reference):

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

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

{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 变量,因为它更清晰、更易读且更易于维护(否则您会将所有内容都放在一个字符串中,这会使您更难阅读和调试)。

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