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
相关产品推荐
相关产品推荐

