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

Next.js生成站点地图时遭遇ERR_INVALID_ARG_TYPE错误求助

解决Next.js站点地图生成脚本中的ERR_INVALID_ARG_TYPE错误

错误原因

错误提示明确指出writeFileSync的data参数收到了Promise实例,而非预期的字符串、Buffer等类型。问题根源在于Prettier v3及以上版本中,prettier.format已改为异步函数,会返回Promise对象,而你直接将这个未解析的Promise传给了同步的writeFileSync,导致类型不匹配。

解决方案

在调用prettier.format时添加await关键字,等待Promise解析为格式化后的字符串,再传入writeFileSync。

修改后的完整代码

import { writeFileSync } from 'fs';
import { globby } from 'globby';
import prettier from 'prettier';

async function generate() {
    const prettierConfig = await prettier.resolveConfig('./.prettierrc.js');
    const pages = await globby([
        'pages/*.js',
        'data/**/*.mdx',
        '!data/*.mdx',
        '!pages/_*.js',
        '!pages/api',
        '!pages/404.js',
    ]);

    const sitemap = `
    <?xml version="1.0" encoding="UTF-8"?>
    <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
        ${pages
            .map((page) => {
                const path = page
                    .replace('pages', '')
                    .replace('data', '')
                    .replace('.js', '')
                    .replace('.mdx', '');
                const route = path === '/index' ? '' : path;

                return `
              <url>
                  <loc>${`https://www.ashokseedplant.com${route}`}</loc>
              </url>
            `;
            })
            .join('')}
    </urlset>
    `;

    // 关键修改:添加await等待格式化完成
    const formatted = await prettier.format(sitemap, {
        ...prettierConfig,
        parser: 'html',
    });

    // eslint-disable-next-line no-sync
    writeFileSync('public/sitemap.xml', formatted);
}

generate();

补充说明

若你使用的是Prettier v3以下版本,format本身是同步方法,但建议升级到稳定版本并使用异步方式;若需保持同步,也可替换为prettier.formatSync方法,但异步方式更符合Node.js的最佳实践。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 10:00:20