Node.js 如何完全关闭MongoDB连接+;节点mongodb native 3.1中的套接字?

Node.js 如何完全关闭MongoDB连接+;节点mongodb native 3.1中的套接字?,node.js,mongodb,jestjs,Node.js,Mongodb,Jestjs,简言之:当我试图关闭Node.js中的MongoDB连接时,MonogDB驱动程序似乎按照预期关闭了连接本身,但后台的某些东西似乎在等待套接字超时(或超时),这会阻止像Jest这样的事情干净地结束 死亡: 我正在使用NPM软件包“mongodb”:“^3.1.11”(Node.js mongodb Driver 3.1)和“jest”:“^23.6.0”,我知道您应该在测试完成后关闭连接 当前版本似乎与Node.js MongoDB驱动程序2.x相关,版本3不再有db.close()方法 以下是

简言之:当我试图关闭Node.js中的MongoDB连接时,MonogDB驱动程序似乎按照预期关闭了连接本身,但后台的某些东西似乎在等待套接字超时(或超时),这会阻止像Jest这样的事情干净地结束

死亡:

我正在使用NPM软件包
“mongodb”:“^3.1.11”
(Node.js mongodb Driver 3.1)和
“jest”:“^23.6.0”
,我知道您应该在测试完成后关闭连接

当前版本似乎与Node.js MongoDB驱动程序2.x相关,版本3不再有
db.close()
方法

以下是我的简单测试文件:

// example.test.js
const { MongoClient } = require('mongodb');

let client;
let db;

beforeAll(async () => {
    client = await MongoClient.connect('mongodb://localhost:27017', {
        useNewUrlParser: true,
    });
    db = await client.db('testdb');
});

afterAll(async () => {
    await client.close(); // Returns successfully
});

it('should insert and find document', async () => {
    const collection = db.collection('files');
    await collection.insert({name: 'Jest'});
    const doc = await collection.findOne({name: 'Jest'});
    expect(doc._id).toBeDefined();
    expect(doc.name).toBe('Jest');
});
测试完成后,MongoDB连接显然已成功关闭。我甚至可以通过检查MongoDB服务器日志来确认这一点(
结束连接127.0.0.1:33312(0个连接现在打开)
),但Jest仍然拒绝结束该过程。推荐的Jest CLI选项
--detectOpenHandles
不输出任何内容

我意识到,6分钟后,玩笑终究会成功结束;6分钟===360000毫秒,这恰好是
MongoClient.connect
socketTimeoutMS
的默认值

如果我为
socketTimeoutMS
设置自定义值,Jest将在指定时间后完成。从上面编辑测试文件:

// ...
beforeAll(async () => {
    client = await MongoClient.connect('mongodb://localhost:27017', {
        useNewUrlParser: true,
        socketTimeoutMS: 1000, // <----- insert this line
    });
    db = await client.db('testdb');
});
// ...
/。。。
之前(异步()=>{
客户端=等待MongoClient.connect('mongodb://localhost:27017', {
useNewUrlParser:true,

socketTimeoutMS:1000,//如果MongoDB报告连接已关闭,则问题可能是jest无法继续超过某个点。您是否看到消息
jest在测试运行完成后一秒钟未退出。
?在watchman运行时,运行jest似乎有一些问题:Fwiw,我可以看到
jest did没有间歇性地退出…
消息。我无法确定确切的原因。可能值得注意的是,当前,一旦我能够诱导
笑话没有退出…
消息,我现在无法摆脱它。只是给你一个更新,我似乎能够使用
纱线测试-无缓存来摆脱消息我也有同样的问题,mongodb模块似乎为MongoClient对象打开了一个连接,为DB对象打开了另一个连接,如果使用,关闭客户端将不会关闭DB,至少在版本3.5.2中会导致警告。我正在查看模块的源代码,希望能找到一个好的解决方案