Node.js 如何修复柴摩卡的mongo
所以我想在测试开始之前恢复mongo数据库。 我这样做:Node.js 如何修复柴摩卡的mongo,node.js,mongodb,mocha.js,chai,Node.js,Mongodb,Mocha.js,Chai,所以我想在测试开始之前恢复mongo数据库。 我这样做: const app = require("../app"); const chai = require("chai"); const mongoose = require("mongoose"); const User = require('../models/users'); const Region = require('../models/regions'); const testUsers = require('../testda
const app = require("../app");
const chai = require("chai");
const mongoose = require("mongoose");
const User = require('../models/users');
const Region = require('../models/regions');
const testUsers = require('../testdata/users.json');
const testRegions = require('../testdata/regions.json');
describe('Restoring database', function () {
before(function(done) {
var promises = [
User.deleteMany().exec()
,Region.deleteMany().exec()
];
console.log('Cleaned database');
done();
});
before(function(done) {
testUsers.users.forEach(element => {
var ObjectId = mongoose.Types.ObjectId;
element._id = new ObjectId(element._id);
var newUser = new User(element);
newUser.save(function (err, result) {
if (err) {
console.log("err:",err);
}
});
});
console.log('Users added');
done();
});
before(function(done) {
testRegions.regions.forEach(element => {
var newRegion = new Region(element);
newRegion.save(function (err, result) {
if (err) {
console.log("err:",err);
}
});
});
console.log('Regions added');
done();
});
testdata/users.json
和testdata/regions.json
是包含密钥/对值的简单json文件
这个好看吗?
当我跑的时候
npm test
它没有给出任何错误。在控制台中,我看到:
Restoring database
Cleaned database
Users added
Regions added
但当我在数据库中查找时,我得到了不同的结果。
有时候一切看起来都很好。所有行都在集合中。
有时其中一个集合中缺少几行。
有时其中一个集合是空的
这是一种非常奇怪的行为
我还尝试将变量“promises”添加到“newUser”和“newRegion”中,而不是直接执行它们。
但我仍然得到这些奇怪的结果
交易是什么?问题是由于在异步声明/承诺完成之前调用了
done()
使用或使用承诺,仅在异步语句/承诺完成时调用done()
例如:
无done()
调用,因为我们使用await
语句,这些语句将在每个语句完成后再继续:
before(async function() {
let userResult = await User.deleteMany();
let regionResult = wait Region.deleteMany();
console.log('Cleaned database');
});
或者使用带有承诺的done()
:
before(function(done) {
User.deleteMany()
.then(result => {
console.log('Cleaned database');
done();
});
});
您之前的示例中的语法根本不是添加承诺,而是将这些函数添加到数组中:
var promises = [
User.deleteMany().exec()
,Region.deleteMany().exec()
];
请看以下与帮助相关的内容