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

GraphQL Express React中实现黑底纯JSON格式API响应展示求助

实现黑底语法高亮的JSON展示效果

你提到Open Library没用到CSS是误解——它的效果是靠浏览器内置JSON渲染实现的:后端直接返回application/json类型的响应,浏览器自动识别并应用黑底高亮的默认样式。而你当前是通过React前端渲染JSON字符串,所以分两种方案实现需求:


方案一:后端直接返回JSON(和Open Library逻辑完全一致)

不需要前端React介入,让后端针对/API/:hash路径直接返回纯JSON响应:

修改后端main.ts

在Apollo中间件前新增路由,复用现有业务逻辑:

import { Request, Response } from 'express';
import Data from './src/graphql/resolver/api/Data';
import Books from './src/graphql/resolver/api/Books';

// 新增API路由,直接返回JSON
app.get('/API/:hash', async (req: Request, res: Response) => {
  try {
    const { hash } = req.params;
    // 调用现有Data逻辑验证API密钥
    const apiData = await Data(null, { api_key: hash });
    
    if ('message' in apiData) {
      return res.status(401).json(apiData);
    }
    
    // 获取关联书籍数据
    const books = await Books(apiData);
    const responseData = {
      ...apiData,
      books
    };
    
    // 设置响应类型为JSON,触发浏览器内置渲染
    res.setHeader('Content-Type', 'application/json');
    res.json(responseData);
  } catch (err) {
    res.status(500).json({ message: 'Internal Server Error' });
  }
});

// 保留原有的Apollo GraphQL中间件
app.use(
  '/gql',
  cors<cors.CorsRequest>({ origin: `http://${process.env.DOMAIN}:${process.env.CLIENT_PORT}`, credentials: true }),
  express.json(),
  cp(),
  expressMiddleware(server, {
    context: async ({ req, res }) => ({ req, res })
  })
);

用户访问/API/:hash时,后端直接返回JSON,浏览器会自动用黑底语法高亮样式展示,和Open Library效果完全一致。


方案二:前端React实现语法高亮(保留现有前端路由)

如果必须保留React路由,使用专业语法高亮库react-syntax-highlighter模拟浏览器效果:

1. 安装依赖

npm install react-syntax-highlighter

2. 修改API.tsx

import { Prism as SyntaxHighlighter } from 'react-syntax-highlighter';
import { tomorrow } from 'react-syntax-highlighter/dist/esm/styles/prism';

interface Book {
    cover_i: string
    isbn: string
    title: string
    author_name: string
    __typename: string
}

const API: React.FC = () => {
    const { hash } = useParams<{ hash: string }>()
    const { loading, data, error } = useQuery(APIGQL, { variables: { api_key: hash } })
    const apiState = useSelector((state: RootState) => state.API)
    const dispatch = useDispatch()

    React.useEffect(() => {
        if (!loading && data) {
            const { __typename, books, ...api } = data.api
            dispatch(setApi({
                ...api,
                books: books.map(({ __typename, ...book }: Book) => book)
            }))
        }
    }, [data, error])

    if (loading) return <div>Loading...</div>
    if (error) return <div>Error: {error.message}</div>

    return (
        <SyntaxHighlighter language="json" style={tomorrow}>
            {JSON.stringify(apiState, null, 2)}
        </SyntaxHighlighter>
    )
}

export default API

该方案会在前端渲染出和浏览器内置效果一致的黑底高亮JSON。


补充说明

Open Library的样式并非无CSS,而是浏览器识别application/json响应后,自动应用了内置的CSS规则。如果通过前端渲染JSON字符串,就必须通过CSS或语法高亮库模拟这一效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 14:56:00