我注意到这种奇怪的行为,当少数用户只在生产时,它会在异步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});
});
答案 0 :(得分:1)
您可以在slug字段上应用唯一索引,以确保同一个slug只能存在一次,并且第二次插入操作将失败并在您的回调中显示为错误,您可以根据需要丢弃或提醒用户。
db.collection.createIndex( { slug: 1 }, { unique: true } )
在应用索引之前,您需要清除或修改db上的dup上的slug名称