猫鼬保存卡住(从未调用过回调)

Posted

技术标签:

【中文标题】猫鼬保存卡住(从未调用过回调)【英文标题】:mongoose save stuck (callback never called) 【发布时间】:2016-01-07 22:15:28 【问题描述】:

我正在尝试将 mongoose 对象保存到 db,但它不起作用(没有保存任何内容,也没有返回回调)。数据库已打开,并且连接成功(甚至根据模型创建了集合,并对其进行了索引)。

我的架构:

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var CourseSchema = new Schema(
  providerId: type: String, required: true, unique: true,
  from: 
    provider: type: String, required: true,
    creators: [String]
  ,
  name: type: String, required: true,
  link: type: String, required: true,
  textualInfo:
    summery: String,
    longDescription: String,
    syllabus: String,
    subjects: [String]
  ,
  media: 
    image: String,
    trailer: String
  ,
  meta:
    languages: [String],
    level: Number,
    workload: String,
    duration: String,
    prerequirments: String,
    priceDollars: Number,
    enrollments: Number,
  ,
  dateCreated: type: Date, default: Date.now,
  dateLocalModified: type: Date,
  queries: [String]
);

CourseSchema.index(
  'from.provider': 'text',
  'from.creators': 'text',
  'name': 'text',
  'textualInfo.summery': 'text',
  'textualInfo.longDescription': 'text',
  'textualInfo.syllabus': 'text',
  'textualInfo.subjects': 'text'
,
  name: 'search index', weights: 
  'from.provider': 120,
  'from.creators': 120,
  'name': 150,
  'textualInfo.summery': 20,
  'textualInfo.longDescription': 2,
  'textualInfo.syllabus': 1,
  'textualInfo.subjects': 20
);

CourseSchema.pre('save', function(next) 
  var course = this;
  course.dateLocalModified = new Date();

  if(!course.isModified('providerId')) return next();
  if(!(/@/.test(course.providerId)))
    course.providerId = course.providerId + '@' + course.from.provider;
  
);


var Course = mongoose.model('Course', CourseSchema);
module.exports = Course;

插入测试代码:

    var Course = require('./course');
var mongoose = require('mongoose');

mongoose.connect('mongodb://127.0.0.1:27017/mydb',
  server: socketOptions:  keepAlive: 1 ,
  replset: socketOptions:  keepAlive: 1 
);

var db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function (callback) 
  console.log('mongoose is connected to db');
  var course = new Course(
    providerId: 'pid123',
      from: 
        provider: 'test',
        creators: ['creators']
      ,
      name: 'test course',
      link: 'http://testlink.com',
      textualInfo:
        summery: 'c.shortDescription',
        longDescription: 'c.aboutTheCourse',
        syllabus: 'c.courseSyllabus',
        subjects: ['subjNames'],
      ,
      media: 
        image: 'c.photo',
        trailer:  "https://www.youtube.com/watch?v="
      ,
      meta:
        languages: [],
        level: 0,
        workload: 'c.estimatedClassWorkload',
        duration: "",
        prerequirments: 'c.recommendedBackground',
        priceDollars: 0,
        enrollments: 0,
      ,
      queries: []
  );
  console.log('trying to save:', course.name);
  course.save(function(err)
    console.log(err);
    db.close();
  );
);
db.on('disconnected', function () 
  console.log('Mongoose default connection disconnected');
);

感谢您的帮助!

【问题讨论】:

你解决了吗?我有同样的问题:( @pietro909 我停止使用 mongodb :) 【参考方案1】:

这是死灵术 :D 但也许它会帮助某人。 我认为问题在于“预保存”功能,

它只在一个 if 中返回回调。如果你不进入 if 回调永远不会被调用。

添加一个

return next();

在“CourseSchema.pre('save', function(next)”的末尾应该会为您解决问题。

【讨论】:

以上是关于猫鼬保存卡住(从未调用过回调)的主要内容,如果未能解决你的问题,请参考以下文章

CoreAudio AudioQueue 回调函数从未调用过,没有报错

从未调用过投射自定义频道回调

PhoneGap 插件:从未调用过 AudioEncode 成功回调

网站的 OSX 推送通知 - 从未调用过 Safari requestPermission 回调

Windows (C++) 中的 WH_JOURNALRECORD 挂钩 - 从未调用过回调。

Android 上的 libspotify 从未调用“登录”回调