You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Twitch API数据填充MongoDB模型时属性被存为对象,求助

问题排查与修复方案

核心问题分析

你的代码里有两个关键错误导致MongoDB存储异常:

  1. 未正确等待异步函数返回结果:fetchGameData是async函数,调用时必须用await才能拿到实际数据。你直接调用它得到的是Promise对象,再用JSON.stringify处理Promise,只会把Promise对象转成类似"[object Promise]"的字符串,而非预期的游戏数据。
  2. 重复发起API请求且数组结构有隐患:每次调用fetchGameData都会重新发起一次API请求,既浪费资源又没必要;另外gameData.push(resp.name, resp.summary, resp.artworks)的写法,如果API返回多个游戏,数组会变成[name1, summary1, artworks1, name2, summary2, artworks2...],索引对应关系会完全混乱。

修复后的代码

const mongoose = require('mongoose');
const axios = require('axios').default;
const Game = require('../models/game'); // Import game Model.

const gameQuery = 'fields name, summary, artworks; where name = "Bloodborne";';

// Connect to MongoDB
const connectDB = async () => {
    try {
        await mongoose.connect('mongodb://127.0.0.1:27017/gameApp');
        console.log('MongoDB connection successful!')
    } catch (error) {
        console.log('There was an error...:')
        console.error(error); // 替换未定义的handleError,直接打印错误
    }
}

// 修改fetch函数,只请求一次,返回完整的游戏数据对象
const fetchGameData = async () => {
    const config = {
        url: 'https://api.igdb.com/v4/games/',
        headers: {
          'Client-ID': 'SECRET',
          'Authorization': 'SECRET'
        },
        data : gameQuery
      };
    try {
        const response = await axios.post(config.url, config.data, config);
        // 因为查询的是特定游戏,取第一个结果即可
        return response.data[0] || {};
    }
    catch (err) {
        console.log("Uh oh, there's been an error...:");
        console.error(err);
        return {};
    }
}

const seedDB = async() => {
    await connectDB()
    await Game.deleteMany({})
    // 先等待获取游戏数据
    const gameInfo = await fetchGameData();
    // 直接用获取到的字段创建Game实例
    const Bloodborne = new Game({
        title: gameInfo.name || '',
        summary: gameInfo.summary || '',
        artworks: gameInfo.artworks || []
    })
    await Bloodborne.save()
    console.log('saved')
}
seedDB()

关键修复点说明

  • 单次API请求:修改fetchGameData让它返回完整的游戏对象,避免重复请求,逻辑更清晰。
  • 正确获取异步结果:在seedDB里先通过await fetchGameData()拿到实际数据,再给Game模型的属性赋值。
  • 空值处理:添加|| ''和|| []的默认值,避免API返回空数据时,存储内容不符合模型定义。
  • 修复未定义函数:原代码中handleError未定义,改为直接用console.error打印错误。

内容的提问来源于stack exchange,提问作者VertPin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 02:19:58