MongoDB Atlas错误:无效的架构,预期的mongodb

时间:2019-06-26 04:04:59

标签: node.js mongodb google-cloud-platform mongodb-atlas

我正在通过GCP中的Hello World app tutorial运行。而且我陷入了server.js步骤。

server.js的代码如下:

'use strict';

const mongodb = require('mongodb');
const http = require('http');
const nconf = require('nconf');
let uri = 'mongodb+srv://my_name:<mypassword>@mydatabase-clr75.gcp.mongodb.net/test?retryWrites=true&w=majority';
if (nconf.get('mongoDatabase')) {
  uri = `${uri}/${nconf.get('mongoDatabase')}`;
}
console.log(uri);

mongodb.MongoClient.connect(uri, (err, db) => {
  if (err) {
    throw err;
  }

  // Create a simple little server.
  http.createServer((req, res) => {
    if (req.url === '/_ah/health') {
      res.writeHead(200, {
        'Content-Type': 'text/plain'
      });
      res.write('OK');
      res.end();
      return;
    }

    const collection = db.collection('Messages');
    var datetime = new Date();
    const msg = {
      msgDescription: '\nHello World received on ' + datetime
    };

    collection.insert(msg, (err) => {
      if (err) {
        throw err;
      }

      // push out a range
      let msglist = '';
      collection.find().toArray((err, data) => {
        if (err) {
          throw err;
        }
        data.forEach((msg) => {
          msglist += `${msg.msgDescription}; `;
        });

        res.writeHead(200, {
          'Content-Type': 'text/plain'
        });
res.write('Messages received so far:\n');
        res.end(msglist);
      });
    });
  }).listen(process.env.PORT || 8080, () => {
    console.log('started web process');
  });
});

我收到如下错误:

  

mongodb + srv:// my_name:@ mydatabase-clr75.gcp.mongodb.net / test?retryWrites = true&w = majority   /home/herboratory/node_modules/mongodb/lib/url_parser.js:19       抛出新的错误('无效的架构,预期的mongodb');       ^错误:无效的架构,预期的mongodb       在module.exports(/home/herboratory/node_modules/mongodb/lib/url_parser.js:19:11)       在连接时(/home/herboratory/node_modules/mongodb/lib/mongo_client.js:486:16)       在Function.MongoClient.connect(/home/herboratory/node_modules/mongodb/lib/mongo_client.js:250:3)       在对象。 (/home/herboratory/server.js:12:21)       在Module._compile(module.js:653:30)       在Object.Module._extensions..js(module.js:664:10)       在Module.load(module.js:566:32)       在tryModuleLoad(module.js:506:12)       在Function.Module._load(module.js:498:3)       在Function.Module.runMain(module.js:694:10)npm ERR!代码ELIFECYCLE npm ERR! errno 1 npm错误! test@1.0.0开始:node server.js npm ERR!退出状态1 npm ERR! npm ERR!失败于   test@1.0.0启动脚本。 npm ERR!这可能不是问题   npm。上面可能还有其他日志记录输出。 npm ERR!一种   此运行的完整日志可以在以下位置找到:npm ERR!
  /home/herboratory/.npm/_logs/2019-06-26T03_58_26_823Z-debug.log

我想知道这里是在读取同一错误行的其他文章后出现格式错误,所以我尝试了'...',“ ...”,并且不带引号,但仍然出错。请指导我哪里出了问题?

除了URI之外,我还需要在代码内部进行其他修改吗?据我从指令中了解到的,我只需要插入自己的Atlas Connection字符串即可。

非常感谢。

2 个答案:

答案 0 :(得分:0)

错误invalid schema, expected mongodb表示您正在使用过时的节点驱动程序版本。旧的驱动程序无法解析新的mongodb+srv URI方案。

在此票据NODE-1145的节点驱动程序版本3.0中添加了对mongodb+srv方案的支持。

使用以下命令升级您的节点驱动程序:

$ npm install mongodb

错误会消失。

答案 1 :(得分:0)

我有同样的错误。问题出在mongoDB Atlas中,而我的应用程序中。

在mongoDB Atlas中:

  • 创建数据库并进行收集
  • 创建数据库用户
  • 在IP白名单,网络访问中添加您的IP地址(公共)

我的解决方案示例:

文件.env

MONGO_URI=mongodb+srv://jmendoza:your-password@cluster0-7rxkw.mongodb.net/nodeapi?retryWrites=true&w=majority
PORT=3000

文件app.js

const express = require('express');
const morgan = require('morgan');
const dotenv = require('dotenv');
const mongoose = require('mongoose');
const bodyParser = require('body-parser');
const expressValidator = require('express-validator');
const { postRoutes } = require('./routes/posts');

const app = express();
const port = process.env.PORT || 3000;

dotenv.config();

// BD
mongoose.connect(process.env.MONGO_URI, { useNewUrlParser: true, useUnifiedTopology: true })
    .then(() => console.log('mongoDB, Atlas. Connected'))
    .catch((err) => console.error(err));

// Middleware
app.use(morgan('dev'));
app.use(bodyParser.json());
app.use(expressValidator());

// Routes
app.use('/api/v1', postRoutes);

app.listen(port, () => {
    console.log(`A NodeJS API is listining on port: ${port}`);
});

文件package.json

{
    "name": "node-api",
    "version": "1.0.0",
    "description": "A NodeJS API",
    "main": "app.js",
    "scripts": {
        "dev": "nodemon app.js"
    },
    "keywords": [
        "node",
        "api"
    ],
    "author": "Jonathan Mendoza",
    "license": "ISC",
    "dependencies": {
        "body-parser": "^1.19.0",
        "dotenv": "^8.2.0",
        "express": "^4.17.1",
        "express-validator": "^5.3.1",
        "mongoose": "^5.9.7",
        "morgan": "^1.9.1",
        "nodemon": "^2.0.3"
    }
}

正在运行的应用程序(控制台)

jmendoza@jmendoza-ThinkPad-T420:~/IdeaProjects/NodeJS-API-Course/Basic-Node-API$ npm run dev

> node-api@1.0.0 dev /home/jmendoza/IdeaProjects/NodeJS-API-Course/Basic-Node-API
> nodemon app.js

[nodemon] 2.0.3
[nodemon] to restart at any time, enter `rs`
[nodemon] watching path(s): *.*
[nodemon] watching extensions: js,mjs,json
[nodemon] starting `node app.js`
A NodeJS API is listining on port: 3000
mongoDB, Atlas. Connected

NodeJS版本

jmendoza@jmendoza-ThinkPad-T420:~/IdeaProjects/NodeJS-API-Course/Basic-Node-API$ node -v
v13.12.0

您可以在GitHub上看到我的完整代码:

https://github.com/JonathanM2ndoza/NodeJS-API-Course/tree/master/Basic-Node-API