我是一名前端开发人员,试图在新的Next项目上拓展视野,第一次学习Node,Mongo和GraphQL的服务器端。因为我已经在以前的项目中使用了客户端Apollo,所以Apollo使我成为最简单的跳入方式。
我一直在关注official docs,在那里我了解了apollo-datasource-mongodb(这似乎是将Apollo Server直接插入本地Mongo数据库的最佳方法。不幸的是,似乎没有这个软件包的任何示例存储库在起作用离开了,所以我被遗忘了。
我的mongo通过mongod
在本地运行,并且可以通过mongo shell执行成功的find()
查询,因此我知道数据库本身状态良好,包含近60万条记录(我正在处理相当大的数据集)。
我还可以通过localhost:4000
访问Apollo游乐场,因此我知道服务器可以正常启动并连接到数据库(此后我一直设法解决相应的Schema提示/错误)。
这是我在操场上使用的查询:
{
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
}
}
我已经在下面附加了我的服务器文件。我怀疑这可能是某种超时错误,例如花很长时间梳理所有600k记录才能找到具有我提供的ID的记录?当我从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本身包含了一个Server声明(也来自
'mongodb'
npm包)。这样的实现是否可以使我免于每次我想在项目上工作时都必须使用mongod
阻塞终端窗口?非常感谢您的参与!如果我可以完成这项工作,那么我一定会在Medium上进行完整的撰写,或者为其他希望将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 }`);
});
最佳答案
实际上,还有另一件事可能导致此问题,因为我也遇到了相同的确切错误“拓扑已关闭,请连接”。
问题是,如果您有一个动态IP地址,那么在MongoDB map 集中,您应该尝试允许所有IP地址。
添加IP地址:0.0.0.0/0
将这个IP地址列入白名单后,我所有的问题都解决了。
动态IP 0.0.0.0/0
的图片:
关于node.js - MongoError : Topology is closed,请连接,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59657450/