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

测试报错"ReferenceError: fetch is not defined",已安装node-fetch未导入

问题解决:fetch未定义导致测试失败

已安装node-fetch包,但当前代码未导入该包就直接使用fetch,导致fetch未定义,进而引发测试失败。其他文件未导入却能正常运行,大概率是环境差异导致——比如其他代码运行在浏览器环境(浏览器原生支持fetch),而当前是Next.js API路由,运行在Node.js环境(Node本身不自带fetch)。

修复步骤

1. 在API路由文件中导入node-fetch

根据你安装的node-fetch版本,选择对应导入方式:

  • v2版本或v3+版本(ES模块):
import fetch from 'node-fetch';

修改后的完整代码:

import { IQuery } from 'models/IQuery.interface';
import { NextApiRequest, NextApiResponse } from 'next';
import { handleProxyResponse } from 'utils/handleProxyResponse.util';
import { appendApiRoute, getDefaultHeaders, getLocale } from 'utils/proxy.util';
import fetch from 'node-fetch'; // 新增导入

export const getContentPage = async (locale: string, publicId: string) => {
    const headers = getDefaultHeaders();
    // fetch已定义,同时补上await确保拿到响应对象
    const response = await fetch(appendApiRoute(`static-content/v1/${locale}/pages/${publicId}`), {
        method: 'GET',
        headers
    });

    return response;
};

export default async (request: NextApiRequest, response: NextApiResponse) => {
    const currentLocale = getLocale(request);
    const { query } = request;
    const { slug } = query as IQuery;

    const result = await getContentPage(currentLocale, slug);

    return handleProxyResponse(result, response);
};

注意:原代码中fetch调用缺少await,会直接返回Promise对象,补上await才能拿到实际响应,避免后续逻辑异常。

2. 修复测试用例

测试环境同样需要确保fetch可用,有两种处理方式:

方式一:直接导入node-fetch到测试文件

import fetch from 'node-fetch';
import contentProxy from '../path-to-your-api-file';

it('should return handledProxyResponse', async () => {
    const result = await contentProxy(defaultRequest, response);

    expect(result).toEqual(handleProxyResponseReturnValue);
});

方式二:用Jest模拟fetch(推荐,避免发起真实请求)

import contentProxy from '../path-to-your-api-file';
import { handleProxyResponse } from 'utils/handleProxyResponse.util';

jest.mock('node-fetch');
jest.mock('utils/handleProxyResponse.util', () => ({
    handleProxyResponse: jest.fn(() => 'mock-response')
}));

it('should return handledProxyResponse', async () => {
    const mockFetch = jest.requireMock('node-fetch');
    mockFetch.mockResolvedValue({ ok: true }); // 模拟fetch成功响应

    const result = await contentProxy(defaultRequest, response);

    expect(result).toEqual('mock-response');
    expect(handleProxyResponse).toHaveBeenCalled();
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 05:35:50