使用Mongoose.js Model.Remove(条件,回调) - 删除成功但没有调用回调

时间:2015-06-03 17:40:21

标签: node.js mongodb callback mongoose

我已经简化为以下最基本的可能版本......

    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,这样你就可以看到它们是如何组合在一起的。 ; - )

1 个答案:

答案 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
});