【问题标题】:Mongoose callback never reached when saving保存时从未到达 Mongoose 回调
【发布时间】:2015-06-14 19:26:53
【问题描述】:

由于某种原因,当尝试使用 Mongoose 将数据保存到 MongoDB 数据库时,永远不会调用回调函数。一开始以为没有触发错误码,后来又测试了回调函数有没有输入,结果没有!并且没有任何内容保存在数据库中。我什至在存储其他 MongoDB 数据库的文件夹中都看不到名为 client-db 的文件(通过命令行)——这可能是问题吗?

我尝试过针对类似问题的不同解决方案,但到目前为止没有任何效果。有谁知道我做错了什么?我希望有任何帮助!

这是我的代码的相关部分:

client-db.js:

var mongoose = require('mongoose');
var db = mongoose.connect('mongodb://localhost/client-db', function(){
  console.log("Client DB: connected"); // This is shown
});

module.exports = mongoose;
//module.exports = db; // Another problem was solved by this, but didn't work for me

绘图数据.js:

var db = require('client-db');

var plotDataSchema = db.Schema({
  time: {type: Number, required: true},
  value: {type: Number}
});

var PlotData = db.model('PlotData', plotDataSchema);

module.exports = PlotData;

controller.js:

var PlotData = require('plot-data');

//data is an object with time and value

var plotData = new PlotData({
  time: data.time,
  value: data.value
});

plotData.save(function(err){
  console.log('Entered callback'); // Never shown
  if(err){
    console.log(err); // Never shown
    //return handleErrror(err); // Different things I tried when I thought the error handling was the problem - didn't change anything
    //return next(err);
  }else{
    console.log('Plot data saved in client db'); // Never shown
  }
});

【问题讨论】:

  • 将err 作为参数传递给您的 mongoose.connect() 回调,例如var db = mongoose.connect('mongodb://localhost/client-db', function(err){。然后,在回调内部,定义了err,如果定义了,值是多少?
  • 它给了我一个错误,我发现我只需要在运行 node.js 应用程序之前从命令行手动启动 mongod。问题已解决 - 非常感谢 :)

标签: node.js callback mongoose save


【解决方案1】:

如果您确实已连接,那么看起来您的数据库连接和保存操作正在发生争用情况。将您的代码压缩为单个文件并在连接回调中执行保存。

var mongoose = require('mongoose');
var plotDataSchema = mongoose.Schema({
  time: {type: Number, required: true},
  value: {type: Number}
});
var PlotData = mongoose.model('PlotData', plotDataSchema);
var plotData = PlotData({
  time: 1234,
  value: 5678
});

mongoose.connect('mongodb://localhost/client-db', function(err) {
  if (err) { console.log(err); return; }
  console.log("Client DB: connected"); // This is shown

  plotData.save(function(err, plot){
    console.log(err, plot);
    // outputs
    // null { __v: 0, time: 1234, value: 5678, _id: 5526892bcffa7a0e973fb456 }
  });
});

还有一些关于猫鼬的一般注意事项:

  • 它有一个用于模型、模式和连接的内部全局缓存(以及每个连接的缓存),因此无需这样做:module.exports = mongoose;。只需在需要的地方使用 mongoose(节点也有自己的缓存,因此它只会将已经存在的 mongoose 导出到请求文件中)。
  • 按照上述要点,由于模型的内部缓存,您不需要这样做:module.exports = PlotData。只需要 mongoose,然后您可以:var PlotData = mongoose.model('PlotData'); 从缓存中检索模型。

所以你的文件看起来像:

client-db.js

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/client-db', function(err){
  if (err) { console.log(err); return; }
  console.log("Client DB: connected"); // This is shown
});

plot-data.js

var mongoose = require('mongoose');
var plotDataSchema = mongoose.Schema({
  time: {type: Number, required: true},
  value: {type: Number}
});

mongoose.model('PlotData', plotDataSchema);

controller.js

var mongoose = require('mongoose');
var PlotData = mongoose.model('PlotData'); // Notice schema is not specified

var plotData = new PlotData({
  time: data.time,
  value: data.value
});

// NEED TO WAIT FOR CONNECTION BEFORE CALLING
plotData.save(function(err, plot){
  console.log(err, plot);
});

【讨论】:

  • 感谢您的回答。问题是数据库没有启动,但你有一些我会记住的好点:)
  • 没问题。如果您发现该答案有帮助并认为其他用户也可以将其标记为已接受,以防他们偶然发现此问题?
  • 问题出在数据库连接上,所以我认为将其标记为正确答案会产生误导。正确答案是 JoGoFo 的评论。但我仍然感谢您的帮助。
猜你喜欢
  • 2016-01-11
  • 1970-01-01
  • 2016-11-17
  • 2013-10-21
  • 1970-01-01
  • 2014-09-14
  • 2012-05-31
  • 2016-02-01
  • 2016-01-06
相关资源
最近更新 更多