当前位置: 首页 > 知识库问答 >
问题:

如何连接到MongoDB使用Node.js写在TypeScript?

司寇善
2023-03-14

我正在处理一个节点。js服务器,连接到MongoDB,用TypeScript编写。当我尝试使用MongoDB时,它不会创建连接,但是当我检查mongo输出时,它似乎确实创建了连接。

在节点中定义连接的代码中缺少了什么。js?

我的连接字符串mongodb://localhost:27017“

我的连接方式:

connect() {
    console.log('connecting to mongo') //this is called
    MongoClient.connect(this.connectionString, {useNewUrlParser: true})
    .then(client => {
        console.log('setting client'); //this doesn't get called
        this.client = client;
        console.log(this.client);
    })
    .catch(error => {
        console.log('error during connecting to mongo: '); //this also doesn't get called
        console.error(error);
    });
}

Mongo输出:

2018-11-08T23:06:24.106 0100网络[监听器]连接从127.0.0.1:51345#11接受(2个连接现在打开)

2018-11-08T23:06:24.107 0100 I网络[conn11]从127.0.0.1:51345 conn11:{driver:{name:“nodejs”,version:“3.1.9”},os:{type:“Darwin”,name:“Darwin”,architecture:“x64”,version:“17.7.0”},platform:“Node.js v8.3,LE,mongodb核心:3.1.8”}

我的存储库https://github.com/FrisoDenijs/MEAN-ToDo/blob/master/server/src/db/mongo.db.ts完整的代码。

控制台。日志(db)根据shkaper的要求

MongoClient {
  domain: null,
  _events: {},
  _eventsCount: 0,
  _maxListeners: undefined,
  s:
   { url: 'mongodb://localhost:27017',
     options:
      { servers: [Array],
        caseTranslate: true,
        useNewUrlParser: true,
        socketTimeoutMS: 360000,
        connectTimeoutMS: 30000,
        promiseLibrary: [Function: Promise] },
     promiseLibrary: [Function: Promise],
     dbCache: {},
     sessions: [] },
  topology:
   Server {
     domain: null,
     _events:
      { serverOpening: [Function],
        serverDescriptionChanged: [Function],
        serverHeartbeatStarted: [Function],
        serverHeartbeatSucceeded: [Function],
        serverHeartbeatFailed: [Function],
        serverClosed: [Function],
        topologyOpening: [Function],
        topologyClosed: [Function],
        topologyDescriptionChanged: [Function],
        commandStarted: [Function],
        commandSucceeded: [Function],
        commandFailed: [Function],
        joined: [Function],
        left: [Function],
        ping: [Function],
        ha: [Function],
        authenticated: [Function],
        error: [Function],
        timeout: [Function],
        close: [Function],
        parseError: [Function],
        open: [Object],
        fullsetup: [Object],
        all: [Object],
        reconnect: [Function] },
     _eventsCount: 25,
     _maxListeners: Infinity,
     clientInfo:
      { driver: [Object],
        os: [Object],
        platform: 'Node.js v8.9.3, LE' },
     s:
      { coreTopology: [Object],
        sCapabilities: null,
        clonedOptions: [Object],
        reconnect: true,
        emitError: true,
        poolSize: 5,
        storeOptions: [Object],
        store: [Object],
        host: 'localhost',
        port: 27017,
        options: [Object],
        sessionPool: [Object],
        sessions: [],
        promiseLibrary: [Function: Promise] } } }

共有3个答案

太叔乐家
2023-03-14

上述解决方案确实有效,但我更喜欢另一种方法。它更像是一个标准的HTTP调用(我已经让它在使用和不使用async await时都可以使用,但最好还是保留它):

private async connect(){
    this.mongo = new mongodb.MongoClient(this.url, {useNewParser: true});
    await this.mongo.connect((err, client) => {
        if(client.isConnected()){
            console.log('setting client');
            this.client = client;
            console.log(this.client);
        }
        else{
            console.log('error during connecting to mongo: ');
            console.error(error);
        }
    });
}

这是基于节点的。js驱动程序api v3。2.你可以看看这里:https://mongodb.github.io/node-mongodb-native/3.2/api/index.html

这可能只是给猫刮胡子的另一种方式,但我认为这值得以后来到这里的任何人分享。

强化
2023-03-14

根据您所说的既不调用错误也不调用成功回调,我认为问题不仅在于这里的代码:https://github.com/FrisoDenijs/MEAN-ToDo/blob/master/server/src/db/mongo.db.ts但这里也有:https://github.com/FrisoDenijs/MEAN-ToDo/blob/master/server/src/controllers/to-do.controller.ts当你运行mongo时。connect应该有一个选项来等待从MongoClient返回的promise。连接。所以我会在mongo中更改代码。db。例如这样的事情(这取决于你想如何处理这个promise):

connect() {
    console.log('connecting to mongo')
    return MongoClient.connect(this.connectionString, {useNewUrlParser: true})
    .then(client => {
        console.log('setting client');
        this.client = client;
        console.log(this.client);
    })
    .catch(error => {
        console.log('error during connecting to mongo: ');
        console.error(error);
    });
}

然后在to-do.controller.ts中,您可以等待或使用然后

get(req: Request, res: Response) {
    const mongo = new MongoDb();
    mongo.connect().then(() => {

      const db = mongo.getDb();
      const collection = db.collection('todo', (error, collection) => {
          if (error) {
              res.json(error);
              res.statusCode = HttpStatus.BAD_REQUEST
              return;
          }

          collection.find().toArray((error, result) => {
              if (error) {
                  res.json(error);
                  res.statusCode = HttpStatus.BAD_REQUEST
              }

              res.json(result);
              res.statusCode = HttpStatus.OK;
          })

      });

      mongo.close();
    });
} 

我想你的代码只是不“等待”连接建立然后失败。

贺宝
2023-03-14

问题是因为mongo.connect是异步代码,控制器错误地调用它。因此,后续行mongo.getDb()将在没有正确启动this.client的情况下执行。

由于您使用Typecript,我们可以使用async/wait来获得更简洁的代码。

async connect() { // add async
    console.log('connecting to mongo');

    try {
      if (!this.client) { // I added this extra check
        console.log('setting client');
        this.client = await MongoClient.connect(this.connectionString, { useNewUrlParser: true })
        console.log(this.client);      
      }
    } catch(error) {
      console.log('error during connecting to mongo: ');
      console.error(error);
    }    
}

在控制器代码中

async get(req: Request, res: Response) { // add async
  const mongo = new MongoDb();
  await mongo.connect(); // add await
  const db = mongo.db(); 
  // ....     
}

我尝试了你的回购更改,得到了这个回应

希望有帮助

 类似资料:
  • 本文向大家介绍Node.js 使用Mongoose连接到MongoDB,包括了Node.js 使用Mongoose连接到MongoDB的使用技巧和注意事项,需要的朋友参考一下 示例 首先,使用以下命令安装Mongoose: 然后,将其添加server.js为依赖项: 接下来,创建数据库模式和集合名称: 创建一个模型并连接到数据库: 接下来,启动MongoDB并server.js使用运行node s

  • 问题内容: 我将mongodb的node-mongodb-native驱动程序用于编写网站。 我有一个关于如何一次打开mongodb连接,然后在中的集合名称用户和中的集合名称帖子中使用它的问题 我想在其中打开数据库连接以为用户插入/保存数据并发布帖子 当前代码,我的 我曾经在如下 和 问题答案: 您可以连接一次,然后根据需要重复使用多次: 然后重用它:

  • 问题内容: 如何使用Node.js通过SSL连接到MongoDB服务器? 我已经阅读了一些驱动程序(mongojs,mongodb- native )的源代码,并且我已经搜索了一段时间,但是似乎找不到任何合适的教程,指南或文档。 问题答案: 如评论中所建议,具有所需的一切。 我使用以下命令启动并运行: 编辑 你也可以从猫鼬做ssl :

  • MongoDB是一种文档导向数据库管理系统,由C++撰写而成。 本章节我们将为大家介绍如何使用 Node.js 来连接 MongoDB,并对数据库进行操作。 如果你还没有 MongoDB 的基本知识,可以参考我们的教程:MongoDB 教程。 安装驱动 本教程使用了淘宝定制的 cnpm 命令进行安装: $ cnpm install mongodb 接下来我们来实现增删改查功能。 创建数据库 要

  • 这是我的: 和Dockerfile goparser: 连接MongoDB需要使用哪个地址?

  • 我每天都在连接mongo db,它工作得很好,但今天它困扰着我下面的错误,任何人都可以帮我请。 连接到:测试2017-01-10T14:26:13.073 0530警告:连接到127.0.0.1:27017失败,原因:错误号:111连接被拒绝2017-01-10T14:26:13-074 0530错误:无法连接到服务器127.0-0.1:27017(127.0.0.1),在src/mongo/sh