使用Twitch API数据填充MongoDB模型时属性被存为对象,求助
问题排查与修复方案
核心问题分析
你的代码里有两个关键错误导致MongoDB存储异常:
- 未正确等待异步函数返回结果:
fetchGameData是async函数,调用时必须用await才能拿到实际数据。你直接调用它得到的是Promise对象,再用JSON.stringify处理Promise,只会把Promise对象转成类似"[object Promise]"的字符串,而非预期的游戏数据。 - 重复发起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
相关产品推荐
相关产品推荐

