1

我正在尝试调用 TwitchAPI 并将一些返回的数据插入 MongoDB。但是,每次我收到此错误时:Error: Meteor requires document _id fields to be non-empty strings or ObjectIDs.

单个流/频道的 Twitch API 响应如下所示:

{
  "streams": [
    {
      "_id": 11220687552,
      "game": "League of Legends",
      "viewers": 11661,
      "created_at": "2014-09-30T01:10:36Z",
      "_links": {
        "self": "http://api.twitch.tv/kraken/streams/mushisgosu"
      },
      "preview": {
        "small": "http://static-cdn.jtvnw.net/previews-ttv/live_user_mushisgosu-80x50.jpg",
        "medium": "http://static-cdn.jtvnw.net/previews-ttv/live_user_mushisgosu-320x200.jpg",
        "large": "http://static-cdn.jtvnw.net/previews-ttv/live_user_mushisgosu-640x400.jpg",
        "template": "http://static-cdn.jtvnw.net/previews-ttv/live_user_mushisgosu-{width}x{height}.jpg"
      },
      "channel": {
        "_links": {
          "self": "https://api.twitch.tv/kraken/channels/mushisgosu",
          "follows": "https://api.twitch.tv/kraken/channels/mushisgosu/follows",
          "commercial": "https://api.twitch.tv/kraken/channels/mushisgosu/commercial",
          "stream_key": "https://api.twitch.tv/kraken/channels/mushisgosu/stream_key",
          "chat": "https://api.twitch.tv/kraken/chat/mushisgosu",
          "features": "https://api.twitch.tv/kraken/channels/mushisgosu/features",
          "subscriptions": "https://api.twitch.tv/kraken/channels/mushisgosu/subscriptions",
          "editors": "https://api.twitch.tv/kraken/channels/mushisgosu/editors",
          "videos": "https://api.twitch.tv/kraken/channels/mushisgosu/videos",
          "teams": "https://api.twitch.tv/kraken/channels/mushisgosu/teams"
        },
        "background": null,
        "banner": "http://static-cdn.jtvnw.net/jtv_user_pictures/mushisgosu-channel_header_image-c5c08cce281b7be3-640x125.jpeg",
        "display_name": "MushIsGosu",
        "game": "League of Legends",
        "logo": "http://static-cdn.jtvnw.net/jtv_user_pictures/mushisgosu-profile_image-b1c8bb5fd700025e-300x300.png",
        "mature": false,
        "status": "CLG hi im Gosu - Challenger AD - Smurfing Master!",
        "partner": true,
        "url": "http://www.twitch.tv/mushisgosu",
        "video_banner": "http://static-cdn.jtvnw.net/jtv_user_pictures/mushisgosu-channel_offline_image-7e3401b20cb5d739-640x360.png",
        "_id": 41939266,
        "name": "mushisgosu",
        "created_at": "2013-03-31T21:12:14Z",
        "updated_at": "2014-09-30T03:08:55Z",
        "abuse_reported": null,
        "delay": 60,
        "followers": 318914,
        "profile_banner": null,
        "profile_banner_background_color": null,
        "views": 25963780,
        "language": "en-us"
      }
    }
  ],
  "_total": 8477,
  "_links": {
    "self": "https://api.twitch.tv/kraken/streams?limit=1&offset=0",
    "next": "https://api.twitch.tv/kraken/streams?limit=1&offset=1",
    "featured": "https://api.twitch.tv/kraken/streams/featured",
    "summary": "https://api.twitch.tv/kraken/streams/summary",
    "followed": "https://api.twitch.tv/kraken/streams/followed"
  }
}

我的服务器方法中尝试插入数据的部分

            Meteor.call('getStreams', function(err, res) {
                var data = res.data.streams;
                console.log(data);
                data.forEach(function(item) {
                    console.log(item._id);
                    Streams.insert({
                        _id: item._id,
                        title: item.channel.status,
                        author: item.channel.display_name,
                        url: item.url
                    });
                });
            });

getStreams simple 定义要调用的 url 并设置一些变量。如您所见,我正在控制台记录预期的_id内容,因此我知道它返回了一个有效的字符串,但我仍然收到错误消息。目前,当我拨打电话时,我一次返回 100 个流并遍历它们以保存上面的 4 个字段。理想情况下,我想将每个流对象作为其自己的条目保存在数据库中,但我所做的所有尝试都导致了相同的错误,而且我还在某处读到与 Meteor 捆绑的“miniMongo”版本不支持插入批量对象数组...我也读过 miniMong 不支持,很遗憾我认为用最新的 API 调用信息Collection.save()更新每个对象的内容会更晚,因为我不能只使用_id.save在同一语句中更新和插入。

我不确定它是否有任何影响,但我确实尝试在创建集合时设置autoIndexIdfalse,但这似乎并不重要:

Streams = new Meteor.Collection('streams', {autoIndexId: false});

任何见解都值得赞赏。

4

1 回答 1

2

问题是 twitch_id不是 a String,它似乎是 a Number(我可以从您的 JSON 的输出中看出:数字没有被引号包围)。

我要做的是让 Meteor 生成自己的内部 Mongo ID 并将 twitch 存储_id为单独的属性。

Streams.insert({
  twitchId: item._id,
  title: item.channel.status,
  author: item.channel.display_name,
  url: item.url
});

您将不得不通过twitchId而不是检索流_id,但这几乎不是问题,对吧?

于 2014-09-30T05:23:12.463 回答