gpt4 book ai didi

node.js - MongoError : Topology is closed, 请连接

转载 作者:太空宇宙 更新时间:2023-11-03 23:50:27 29 4
gpt4 key购买 nike

我是一名前端开发人员,试图在新的 Next 项目中拓展自己的视野,第一次学习 Node、Mongo 和 GraphQL 的服务器端。 Apollo 对我来说是最简单的入门方式,因为我已经在之前的项目中使用过客户端 Apollo。

我一直在关注official docs ,我在那里了解到 apollo-datasource-mongodb (这似乎是将我的 Apollo 服务器直接插入本地 Mongo 数据库的最佳方法。不幸的是,似乎没有这个包的任何示例存储库供我作弊,所以我只能蒙混过关。

我通过 mongod 在本地运行 mongo,并且可以通过 mongo shell 成功执行 find() 查询,因此我知道数据库本身状况良好,并且包含近600,000 条记录(我正在使用相当大的数据集)。

我还可以通过 localhost:4000 访问 Apollo Playground,因此我知道服务器正在正常启动并连接到数据库(以及我后来设法解决的适当架构提示/错误)。

这是我在 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
}
}

我已在下面附加了我的服务器文件。我怀疑这可能是某种超时错误,就像需要很长时间才能梳理所有 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)

但我自己没有使用异步或 promise 。这让我思考——我应该这样做吗?在等待 findOneById() 返回时,我是否可以以某种方式暂停该过程(如果这确实是问题所在)?

顺便说一句,我至少看到过一个示例代码库,其中 MongoClient 在其自身中包含了一个服务器声明(也来自 '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 atlas 中您应该尝试允许所有 IP 地址。

添加IP地址:0.0.0.0/0将这个IP地址列入允许所有的白名单后,我所有的问题都得到了解决。

动态IP 0.0.0.0/0的图像:

enter image description here

关于node.js - MongoError : Topology is closed, 请连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59657450/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com