Meteor,MongoDb:在少数几次出现时双重收集

时间:2016-02-18 16:35:39

标签: node.js mongodb asynchronous meteor

我注意到这种奇怪的行为,当少数用户只在生产时,它会在异步Meteor调用中多次插入每个项目。我尝试了很多东西,但没有任何效果。我无法在localhost上测试,但是在本地主机或生产中它从未发生过。

我花了整整一夜来解决这个问题,但没有找到任何解决办法。我想这是由新的Date()引起的,但我必须在某个地方调用它。生产服务器位于阿姆斯特丹,似乎只发生在欧洲以外的用户。

我发现这是类似的问题,但无法真正解决如何实施问题 - https://github.com/meteor/meteor/issues/4263

Slug是同样的歌曲应该有相同的。

这是工作流程,用户点击触发addNewSong功能的歌曲:

addNewSong = function (track) {

 Globals.current_track = track;

 checkIfSongAlreadySaved();
}

我需要检查歌曲是否已经收藏,如果是 - >路由到它,否则创建新歌并路由到它。

checkIfSongAlreadySaved = function() {

  loadPrimaryGlobalItems();

  Meteor.call('checkIfSongAlreadySaved', Globals.current_song_item_slug, function(error, result) {
    if( result.item ) {

      Globals.current_song_item_id = result.item._id;
      Globals.current_song_item_slug = result.item.slug;

      routeToSongPage();

      if (! (result.item.download && result.item.mp3) ) {
        downloadSong();
      }
    }
    else {

      loadSecondaryGlobalItems();

      var item = {
        slug:Globals.current_song_item_slug,
        duration:Globals.current_duration,
        thumbnail:Globals.current_song_thumbnail,
        title:Globals.current_cleaned_song,
        album:Globals.current_track.album,
        artist:Globals.current_track.artists[0],
        track:Globals.current_track.name,
        date:result.date,
      }

      Globals.current_song_item_id = Songs.insert(item);

      routeToSongPage();

      downloadSong();

      recentSongItem(result.date);
    }
  });
}

添加最近的歌曲

recentSongItem = function (date) {

  Recentsongs.insert({
    slug:Globals.current_song_item_slug,
    songId:Globals.current_song_item_id,
    title:Globals.current_cleaned_song,
    duration:Globals.current_duration,
    date:date,
  });
}

如果要制作新歌,

downloadSong = function() {

  Meteor.call('findSong', Globals.current_song, function(error, result) {
    console.log(result);
    if (result) {
        Globals.current_song_mp3 = true;
        updateSongItemDownload(result.itemDetails);
    }
    else {
      alert('not found')
    }
  });
}

并更新歌曲,添加下载和mp3值。

updateSongItemDownload = function(link) {

  Songs.update({
    _id: Globals.current_song_item_id
  },
  {
    $set: {
      download: link,
      mp3: Globals.current_song_mp3,
    }
  });
}

服务器方法:

Meteor.methods({
  checkIfSongAlreadySaved: function(slug) {
    return {item: Songs.findOne({slug:slug}), date: new Date()};
  },
  findSong:function(song) {

    ServerGlobals.current_song = song;

    var result = searchSite();

    return result;
  },
});

编辑:

这是我的订阅,以防它可能导致问题:

Template.songPage.onCreated(function() {
  Session.set('processing', true);
  var self = this;
  self.autorun(function() {
    var id = Router.current().params.id;
    self.subscribe('singleSong', id);
    var item = Songs.findOne({_id: id});
    if (item) {
        if (item.download) {
            createSong(item.download);
        }
        else if( item.download === false ) {
            console.log('item not found');
        }
        Session.set('loader', false);
        Session.set('processing', false);
      }
   });
});

Meteor.publish('singleSong', function(id) {
    check(id, String);
    return Songs.find({_id: id});
});

1 个答案:

答案 0 :(得分:1)

您可以在slug字段上应用唯一索引,以确保同一个slug只能存在一次,并且第二次插入操作将失败并在您的回调中显示为错误,您可以根据需要丢弃或提醒用户。

db.collection.createIndex( { slug: 1 }, { unique: true } )

在应用索引之前,您需要清除或修改db上的dup上的slug名称