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

Next.js 13集成MeshJs报错:元素类型无效,需use-client组件

解决Next.js 13中MeshProvider的组件类型错误并实现Nami钱包连接

错误原因分析

你遇到的Error: Element type is invalid. Received a promise that resolves to: [object Promise]错误,核心原因是MeshProvider依赖客户端API(如useEffect),但被放在了服务器组件环境中,或者导入方式错误导致组件被当作异步Promise处理,而非有效的React组件类/函数。

Next.js 13 App Router中,组件默认是服务器组件,无法运行客户端专属的Hook和API,必须显式标记'use client'声明为客户端组件。

分步解决方案

1. 修正Providers组件的客户端声明

将包含MeshProvider的Providers组件标记为客户端组件,并正确嵌套Redux、Redux Persist和MeshProvider:

// app/providers.tsx
'use client';

import { MeshProvider } from '@meshsdk/react';
import { Provider } from 'react-redux';
import { PersistGate } from 'redux-persist/integration/react';
import { store, persistor } from './your-redux-store-path';

export function Providers({ children }: { children: React.ReactNode }) {
  return (
    <Provider store={store}>
      <PersistGate loading={null} persistor={persistor}>
        {/* MeshProvider必须在客户端组件环境中渲染 */}
        <MeshProvider>
          {children}
        </MeshProvider>
      </PersistGate>
    </Provider>
  );
}

2. 在Root Layout中正常使用Providers

无需修改layout.tsx的服务器组件属性,直接导入并使用上述Providers即可:

// app/layout.tsx
import { Providers } from './providers';

export default function RootLayout({
  children,
}: {
  children: React.ReactNode;
}) {
  return (
    <html lang="zh-CN">
      <body>
        <Providers>{children}</Providers>
      </body>
    </html>
  );
}

3. 实现Nami钱包连接按钮

创建独立的客户端组件,使用MeshJs的useWallet Hook完成钱包连接,并获取公钥地址、网络ID等信息:

// app/components/WalletConnectButton.tsx
'use client';

import { useWallet } from '@meshsdk/react';
import { useState } from 'react';

export default function WalletConnectButton() {
  const { connect, wallet } = useWallet();
  const [walletDetails, setWalletDetails] = useState<{
    address: string;
    networkId: number;
  } | null>(null);

  const handleConnectNami = async () => {
    // 连接Nami钱包
    const connectedWallet = await connect('nami');
    if (!connectedWallet) return;

    // 获取所需信息
    const address = await connectedWallet.getChangeAddress();
    const networkId = await connectedWallet.getNetworkId();
    setWalletDetails({ address, networkId });

    // 将信息发送到后端完成注册
    await fetch('/api/user/register', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({ address, networkId }),
    });
  };

  return (
    <div className="wallet-connect">
      {!wallet ? (
        <button onClick={handleConnectNami}>连接Nami钱包完成注册</button>
      ) : (
        <div className="connected-info">
          <p>已连接地址: {walletDetails?.address}</p>
          <p>当前网络ID: {walletDetails?.networkId}</p>
        </div>
      )}
    </div>
  );
}

关键注意事项

  • 所有使用MeshJs Hook或组件的文件,都必须在顶部添加'use client'声明,确保在客户端环境运行。
  • 避免异步导入MeshProvider(如React.lazy),直接同步导入即可,否则会触发Promise类型错误。
  • 确保MeshJs版本与Next.js 13兼容,若仍有问题,可尝试升级@meshsdk/react到最新稳定版。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 12:17:53