尝试使用mongoose和async保存到数据库时出现多个错误

时间:2016-04-13 10:45:48

标签: javascript node.js mongodb asynchronous mongoose

我正在尝试使用mongoose将某些内容保存到数据库中。事情是我需要确保在我继续执行程序并关闭连接之前完成保存。我知道在mongoose中保存是异步的,我尝试使用这段代码:

saveFunction = function(song){
song.save(function(err, userObj){
    if(err){
        console.log('Error' + err);
    } else{
        console.log('saved successfully:', userObj);
    }

});
};

database.prototype.add= function(newSong){
mongoose.connect(url);

var song = new songModel({id : newSong.getId(),
    title : newSong.getTitle(),
    artist : newSong.getArtist,
    genre : newSong.getGenre(),
    rating : newSong.getRating(),
    link : newSong.getLink()});


console.log("before async");
async.parallel([function (callback){
    saveFunction(song);
    callback();
}],function(){
    mongoose.connection.close();
    console.log('closed connection');
});
console.log("after async");
nextFreeId++;
};

^ songModel是全局定义的。

我尝试了很多不同的方法并改变了很多东西,但我总是得到某些人的错误。使用此代码,我得到一个process.nexttick(function()throw err)错误。我无法让它发挥作用。有人能告诉我什么是错的或给我提供工作代码吗?

我认为最佳控制台应如下所示:

before async
saved successfully
closed connection
after async

谢谢!

编辑:打开异步的其他替代方案。我只想让这段代码以任何可能的方式工作。我只需要保存/找到一些/删除的东西,它需要等待程序的其余执行,直到保存/查找/删除完成。我变得非常绝望,在一个紧张的事情上单独失去了近一天这个问题:(

1 个答案:

答案 0 :(得分:2)

您需要从保存功能返回回调。

saveFunction = function(song,callback){
    song.save(function(err, userObj){
        if(err){
            console.log('Error' + err);
            return callback(true,err)
        } else{
            console.log('saved successfully:', userObj);
            return callback(null);
        }
    });
};

修改

从您的评论中,您期望的行为永远不会发生。你期待

console.log("before async");

async.parallel -> do your bits 
console.log('closed connection');

console.log("after async");

然而,这永远不会发生,因为async.parallel是一个异步调用,这意味着执行不会等待让它完成,然后再转移到下一个命令。你看到的行为是

console.log("before async");

async.parallel -> starts

console.log("after async");

async.parallel -> console.log('closed connection');

节点正在执行第一个日志,启动async.parallel,然后是console.logging"在async"之后。然后,当async.parallel进入其回调函数时,它会打印"关闭连接",因此它出现在" async"之后因为它是在之后执行的。

您要执行的任何逻辑依赖于async.parallel 的结果必须在回调函数中发生。此外,当您想要异步运行2个或更多函数时使用async.parallel,然后在它们全部完成后执行回调。您的解决方案不需要async.parallel。您可以将其替换为:

saveFunction(song,function(err){
    if(err){
        //failed to save song
    }
    mongoose.connection.close(); //you do not need to do this anyway
    console.log('closed connection');
    nextFreeId++;
    //anything else you need to do here
});