2015-10-17 155 views
0

我看到这个问题在这里出现了很多次,但没有一个解决方案为我工作。下面是代码:猫鼬回调函数没有触发

var mongoose = require('mongoose'); 
var Schema = mongoose.Schema; 
var db = mongoose.connection; 
var dbUrl = 'mongodb://george:[email protected]:37234/mydb'; 

var perosonSchema = new Schema({ 
    id: Number, 
    name: String, 
    age: Number, 
    stories: [{type: Schema.Types.ObjectId, ref: "Story"}] 
}); 

var storySchema = new Schema({ 
    _creator: {type: Number, ref: "Person"}, 
    title: String, 
    fans: [{type: Number, ref: "Person"}] 
}); 

var Story = mongoose.model("Story", storySchema); 
var Person = mongoose.model("Person", perosonSchema); 

db.on('error', function() { 
    console.log('there was an error communicating with the database'); 
}); 

mongoose.connect(dbUrl); 

    console.log('connected!'); 

var aaron = new Person({id: 0, name: "Aaron", age: 32}); 
    console.log("created aaron"); 

aaron.save(function(err) { 


    console.log("no error"); 


    var story1 = new Story({ 
     title: "Once upon a time", 
     _creator: aaron.id 
    }); 

    story1.save(function (err){ 
     if(err) return console.log("err"); 
    }); 
}); 
    console.log("finished"); 
    db.close(); 
    process.exit(); 

所以,当我运行该脚本,它会记录它连接的,它创造了阿龙,跳过“没有错误”,只是日志“完成”。值得一提的是,我是猫鼬和节点的完全搭档,如果这是一个简单的问题,那么很抱歉,但我无法弄清楚。

回答

0

这是因为aaron.save是异步调用,它会调用,但是您的程序不会等待响应,只是继续工作,然后退出进程。当亚伦得救时,进程退出; 要修复它,只需调用完成,在回调函数db.close 像这样的事情

aaron.save(function(err) { 
    console.log("no error"); 
    var story1 = new Story({ 
     title: "Once upon a time", 
     _creator: aaron.id 
    }); 

    story1.save(function (err){ 
     if(err) return console.log("err"); 

     console.log("finished"); 
     db.close(); 
     process.exit(); 
    }); 
}); 

这样你的代码将节省亚伦。节能将创造故事,保存后,节省近db和退出过程后


了解更多关于回调的NodeJS这里here

+0

这个工作,非常感谢你 –

+0

欢迎)))然后请标明答案正确 – Gor