gpt4 book ai didi

javascript - 尝试使用 Mongoose 和异步保存到数据库时出现多个错误

转载 作者:可可西里 更新时间:2023-11-01 10:23:07 26 4
gpt4 key购买 nike

我正在尝试使用 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

谢谢!

编辑:对异步的其他替代方案也持开放态度。我只想让这段代码以任何可能的方式工作。我只需要保存/找到一些东西/删除一些东西,它需要等待程序的其余部分执行,直到保存/查找/删除完成。我变得非常绝望,在一个紧张的日程安排中独自在这个问题上浪费了将近一天的时间:(

最佳答案

您需要从保存函数返回一个回调。

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');

Node 正在执行第一个日志,启动 async.parallel,然后是“异步之后”的 console.logging。然后当 async.parallel 到达它的回调函数时,它打印“closed connection”,所以它出现在“after async”之后,因为它是在之后执行的。

您要执行的任何逻辑都依赖于 async.parallel 的结果必须在回调函数中发生。此外,async.parallel 用于异步运行 2 个或多个函数,然后在它们全部完成后执行回调。您的解决方案不需要 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
});

关于javascript - 尝试使用 Mongoose 和异步保存到数据库时出现多个错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36596033/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com