私は新しい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 }`);
});
_