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

React项目Dropdown组件map调用报错,需加载MongoDB语言数据

React下拉菜单加载MongoDB数据时TypeError问题解决

错误原因分析

报错Uncaught TypeError: Cannot read properties of undefined (reading 'map')的核心原因有三点:

  • <DropdownMenu />组件调用时未传入data属性,导致组件内部data为undefined,调用map方法触发错误
  • 前端缺少从后端MongoDB获取语言数据的请求逻辑
  • 后端仅配置了MongoDB连接与数据模型,未提供供前端获取数据的API接口

分步修复方案

1. 给DropdownMenu组件添加默认值,避免初始渲染报错

修改dropdown.jsx,给data参数设置默认空数组,同时修正MongoDB字段映射(原schema为language_code和language,而非value和name):

import React from "react";

function DropdownMenu({ data = [] }) {
  return (
    <div>
      <h1>Dropdown Menu</h1>
      <select>
        {data.map((item) => (
          <option key={item.language_code} value={item.language_code}>
            {item.language}
          </option>
        ))}
      </select>
    </div>
  );
}

export default DropdownMenu;

2. 后端添加API接口,返回MongoDB中的语言数据

在服务器端index.js中添加Express接口(需确保已安装express依赖):

const express = require('express');
const app = express();

// 新增接口:获取所有语言数据
app.get('/api/languages', async (req, res) => {
  try {
    const languages = await Dropdown.find();
    res.json(languages);
  } catch (error) {
    res.status(500).json({ message: 'Failed to fetch languages', error });
  }
});

// 启动服务器,端口可根据实际调整
const PORT = 3001;
app.listen(PORT, () => {
  console.log(`Server running on port ${PORT}`);
});

3. 前端添加数据请求逻辑,将数据传入DropdownMenu

修改chat/index.jsx,使用useState存储数据,useEffect发起请求,并将数据传递给DropdownMenu:

import React, { useState, useEffect } from 'react';
import {
    useMultiChatLogic,
    MultiChatSocket,
    MultiChatWindow,
    ChatSettings,
} from 'react-chat-engine-advanced';
import Header from '@/components/customHeader';
import StandardMessageForm from '@/components/customMessageForms/StandardMessageForm';
import Ai from '@/components/customMessageForms/Ai';
import AiAssist from '@/components/customMessageForms/AiAssist';
import DropdownMenu from '@/components/Dropdown/dropdown';

function Chat({ user, secret }) {
    const chatProps = useMultiChatLogic(
        import.meta.env.VITE_PROJECT_ID,
        user,
        secret
    );
    const [languageData, setLanguageData] = useState([]);

    useEffect(() => {
        const fetchLanguages = async () => {
            try {
                const res = await fetch('http://localhost:3001/api/languages');
                const data = await res.json();
                setLanguageData(data);
            } catch (err) {
                console.error('Fetch languages failed:', err);
            }
        };
        fetchLanguages();
    }, []);

    return (
        <div style={{ flexBasis: '100%' }}>
            <MultiChatSocket {...chatProps} />
            <MultiChatWindow
                {...chatProps}
                style={{ height: '100vh' }}
                renderChatHeader={(chat) => <Header chat={chat} />}
                renderChatSettings={(props)=>{
                    return (
                        <div>
                            <ChatSettings creds={props.creds} chat={props.chat}/>
                            <div>
                                <DropdownMenu data={languageData} />
                            </div>
                        </div>
                    );
                }}
                renderMessageForm={(props) => {
                    if (chatProps.chat?.title.startsWith('AiChat_')) {
                        return <Ai props={props} activeChat={chatProps.chat} />;
                    }
                    if (chatProps.chat?.title.startsWith('AiAssist_')) {
                        return (
                            <AiAssist
                                props={props}
                                activeChat={chatProps.assist}
                            />
                        );
                    }
                    return (
                        <StandardMessageForm
                            props={props}
                            activeChat={chatProps.chat}
                        />
                    );
                }}
            />
        </div>
    );
}

export default Chat;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 07:45:04