我已经简化为以下最基本的可能版本......
UserModel.remove({ }, function (err) {
console.log("inside callback");
})
我已经确认正在删除记录但是从不调用回调。
我使用
成功添加了文档var user = new UserModel(req.body);
user.save(function (err) {
if (err) {
return (next(err));
} else {
res.json(user);
}
});
我已经设置了一些测试并验证了使用mongodb shell插入记录。然后在我调用remove时验证它们已被删除,所以我知道数据库连接是好的。一切都按预期工作,除了回调永远不会被删除。我甚至在save回调中放了一些console.log语句,它按预期工作。
我正在使用节点0.10.33,mongoose 4.0.4和mongodb 2.6.6
关于这里可能发生什么的任何想法?
提前致谢,
杰夫
好的,正如预期的那样,我被要求提供更多背景信息。以上是为了保持简单。 UserModel.remove调用的上下文是以下内容......
var UserModel = require('mongoose').model('User');
exports.create = function (req, res, next) {
var user = new UserModel(req.body);
user.save(function (err) {
if (err) {
return (next(err));
} else {
res.json(user);
}
});
};
exports.list = function (req, res, next) {
UserModel.find({}, function (err, users) {
if (err) {
return next(err);
} else {
res.json(users);
}
});
};
exports.delete = function (req, res, next) {
UserModel.remove({ }, function (err) {
console.log("finished deleting single user");
})
}
mongoose.js是......
var config = require('./config'),
mongoose = require('mongoose');
module.exports = function (){
var db = mongoose.connect(config.dbUri);
require('../app/models/user.server.model');
return db;
}
config.js是......
module.exports = {
sessionSecret: 'developmentSessionSecret',
dbUri: 'mongodb://localhost/test'
};
最后,user.server.model.js是......
var mongoose = require('mongoose'),
Schema = mongoose.Schema;
var UserSchema = new Schema({
firstName: String,
lastName: String,
email: String,
username: String,
password: String
});
mongoose.model('User', UserSchema);
这也是我的mocha测试文件,以防万一...
var boot = require('../server').boot,
shutdown = require('../server').shutdown,
port = require('../server').port,
superagent = require('superagent'),
expect = require('chai').expect,
baseUrl = 'http://localhost:' + port,
Utility = require('../Utility');
describe('server', function () {
before(function () {
boot();
});
describe('homepage', function () {
it('should respond to GET', function (done) {
superagent
.get(baseUrl)
.end(function (err, res) {
expect(res.status).to.equal(200);
done();
})
})
});
describe('/users', function () {
var url = baseUrl + "/users";
var returnedJson,
id;
it('should respond when a JSON message is posted that matches the schema', function (done) {
superagent
.post(url)
.send({ 'firstName': 'Jeff', 'lastName': 'Hegedus', 'email': 'jhegedus@centrifugeit.com', 'username': 'jhegedus', 'password': 'testpassword' })
.end(function (err, res) {
expect(res.status).to.equal(200);
returnedJson = res.text;
done();
})
})
it('should return the result of the insert with the _id populated', function () {
var returnedObject = JSON.parse(returnedJson);
id = returnedObject._id;
expect(id).to.be.ok;
})
it('should respond to get', function (done) {
superagent
.get(url)
.end(function (err, res) {
expect(res.status).to.equal(200);
done();
})
});
// Delete by id
it('should allow delete of the user created', function () {
superagent
.del(url)
.set("id", id)
.end(function (err, res) {
console.log("in response from delete");
expect(res.status).to.equal(200);
returnedJson = res.text;
console.log("deleted " + returnedJson);
done();
})
})
})
after(function () {
shutdown();
});
});
哦,如果你想知道,我正在处理的真正删除功能就是当前状态
exports.delete = function (req, res, next){
var id = req.get("id");
console.log("deleting id = " + id);
if (id == null) {
console.log("deleting all users");
UserModel.remove({}, function (err, users){
if (err) {
return next(err);
} else {
res.json(users);
}
})
} else {
UserModel.remove({ "_id": id }, function (err) {
console.log("deleting single user");
if (err) {
return next(err);
} else {
res.json(users);
}
})
}
}
我知道发布简单版本要好。一半试图将整个事情发布到github,这样你就可以看到它们是如何组合在一起的。 ; - )
答案 0 :(得分:1)
如果您未将done
参数传递给测试回调,mocha
不会等待其完成,但它仍会执行它。你做了:
it('should allow delete of the user created', function () {
// your test
});
这就是为什么您的用户数据被删除的原因,但是您无法看到控制台中记录的任何内容:正在调用delete
路由,UserModel.remove
是正在执行,但mocha
执行正在完成而不等待其返回。只需传递done
回调:
it('should allow delete of the user created', function (done) {
// your test
});