为什么我的 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
失败。
所以我有一个测试尝试使用相同的电子邮件注册两次,此时我依赖 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
失败。