web-dev-qa-db-ja.com

MongoError:トポロジが閉じています。接続してください

私は新しいNextプロジェクトに視野を広げようとしているフロントエンド開発者であり、Node、Mongo、およびGraphQLのサーバー側を初めて学習しました。 Apolloは、以前のプロジェクトでクライアント側のApolloをすでに使用したので、ジャンプする最も簡単な方法として私を攻撃します。

私は official docs に従いました apollo-datasource-mongodb について知りました(おそらく、ApolloサーバーをローカルのMongoデータベースに直接接続するための最良の方法と思われます。残念ながら、このパッケージのレポジトリの例が浮かんでいないように思われるので、私は何とかしなければなりません。

私はmongodを介してローカルで実行しているmongoを持っており、mongoシェルを通じてfind()クエリを正常に実行できるため、データベース自体は良好な状態であり、ほぼを含んでいます600,000レコード(私はかなり大きなデータセットで作業しています)。

また、_localhost:4000_でApollo Playgroundにアクセスできるので、サーバーが適切に起動し、データベースに接続していることがわかります(適切なスキーマヒント/エラーは解決して以来)。

プレイグラウンドで使用しているクエリは次のとおりです。

_{
  item(id: 22298006) {
    title
  }
}
_

そして、これが私が返答するものです:

_{
  "errors": [
    {
      "message": "Topology is closed, please connect",
      "locations": [
        {
          "line": 2,
          "column": 3
        }
      ],
      "path": [
        "item"
      ],
      "extensions": {
        "code": "INTERNAL_SERVER_ERROR",
        "exception": {
          "name": "MongoError",
          "stacktrace": [
            "MongoError: Topology is closed, please connect",

            ...

          ]
        }
      }
    }
  ],
  "data": {
    "item": null
  }
}
_

以下のサーバーファイルを添付しました。これは、タイムアウトエラーのようなものである可能性があるという疑いがあります。たとえば、提供したIDを持つレコードを見つけるためにすべての600kレコードをくまなく調べるのに長い時間がかかるなどです。 MongoClient定義から_useUnifiedTopology: true_を削除すると、別のエラーが発生します。

_UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
_

しかし、私は非同期を使用していないか、自分自身を約束します。私はどちらを考えていますか? findOneById()からの戻りを待つ間、どういうわけかプロセスを保留できますか(それが実際に問題である場合)?

余談ですが、MongoClientがサーバー宣言(_'mongodb'_ npmパッケージからの)自体に含まれているコードベースの例を少なくとも1つ見ました。そのようなものを実装すると、プロジェクトで作業するたびにmongodでターミナルウィンドウをブロックする必要がなくなりますか?

お時間をいただき、ありがとうございました!これを機能させることができれば、間違いなく中程度の完全な記事を作成し、MongoClientをApolloServerとペアリングして迅速かつ簡単なAPIを求める他の人に道を開くでしょう。

index.js

_const { MongoClient } = require('mongodb');
const assert = require('assert');
const { ApolloServer, gql } = require('apollo-server');
const { MongoDataSource } = require('apollo-datasource-mongodb');


const client = new MongoClient('mongodb://localhost:27017/projectdb', { useNewUrlParser: true, useUnifiedTopology: true }, (err) => {
  err && console.log(err);
});

client.connect((err) => {
  assert.equal(null, err);
  client.close();
});

const db = client.db();

class Items extends MongoDataSource {
  getItem(id) {
    return this.findOneById(id);
  }
}

const typeDefs = gql`
  type Item {
    id: Int!
    title: String!
  }
  type Query {
    item(id: Int!): Item
  }
`;

const resolvers = {
  Query: {
    item: (_, { id }, { dataSources }) => dataSources.items.getItem(id),
  }
}

const server = new ApolloServer({
  typeDefs,
  resolvers,
  dataSources: () => ({
    items: new Items(db.collection('items')),
  }),
});

server.listen().then(({ url }) => {
  console.log(`Server ready at ${ url }`);
});
_
5
Teagan Atwater

実際に「トポロジが閉じられました。接続してください」というまったく同じエラーが発生したため、これを引き起こしている可能性のあることがもう1つあります。

問題は、動的IPアドレスがある場合、MongoDBアトラスですべてのIPアドレスを許可してみることです。

IPアドレスを追加します:0.0.0.0/0すべてを許可するこのIPアドレスをホワイトリストに登録した後、私の問題はすべて解決されました。

動的IPの画像0.0.0.0/0

enter image description here

1