为什么我的 Mongoose 连接可能会在两次调用之间关闭?

Why might my Mongoose connection close in-between calls?

所以我有一个测试尝试使用相同的电子邮件注册两次,此时我依赖 Mongo 的唯一约束来抛出错误。如果我 运行 手动查询两次我得到正确的错误但是,在我的测试中我得到一个不同的错误: "MongoError: server is closed" when第二个调用尝试 运行 .save 在 User 模型的那个实例上。我正在使用 Node.js、Express、Mongoose 和 Mocha。

我有一个 beforeEach 函数,它在每次测试之前删除集合并重建索引,但我已经输入了一个控制台日志,证明它不是 运行ning 在模型调用之间,只在开始时一次正如预期的那样。那么为什么我的连接可能会关闭?我看到一些博客建议我增加池大小,但我试过了,但没有任何区别:/

我的测试代码...

// Check no email dupes is being enforced
it("should throw when we try to add user with dupe email", () => {
    assert.throws(async () => {
        await User.addNewUser({
            name: "Mandy  ",
            email: "  Mandy@iscool.com",
            password: "password",
        })
        await User.addNewUser({
            name: "Mandy  ",
            email: "  Mandy@iscool.com",
            password: "password",
        })
    })
})

我的型号代码...

userSchema.statics.addNewUser = async function (params) {
    const randomSlug = cryptoRandomString({length: 64,  type: "url-safe"})
    const hashedPassword = await bcrypt.hash(params.password, 10)
    const user = new User({
        name: params.name,
        email: params.email,
        password: hashedPassword,
        active: false,
        activationCode: randomSlug
    })
    await user.save()
    return randomSlug
}

assert.throws 用于断言错误是从函数同步抛出的。使用 assert.rejects 检测返回被拒绝的 Promise 的 异步 函数:

it("should throw when we try to add user with dupe email", async () => {
  await assert.rejects(async () => {
    await User.addNewUser({
      name: "Mandy  ",
      email: "  Mandy@iscool.com",
      password: "password",
    })
    await User.addNewUser({
      name: "Mandy  ",
      email: "  Mandy@iscool.com",
      password: "password",
    })
  })
})

您可能遇到的情况是 assert.rejects 运行了您的异步函数,但只是返回了一个 Promise;然后测试通过,因为它没有等待异步内容完成,并且您的测试套件可能会关闭连接。然后,在第一个 await 完成后,连接关闭,第二个 addNewUser 失败。