Node.js中writeFileSync保存translateText响应至TXT文件失败问题
解决异步翻译函数结果保存到TXT文件的报错问题
问题描述
使用异步函数translateText()时,两次尝试将结果保存到TXT文件均报错:
- 初始报错:
TypeError [ERR_INVALID_ARG_TYPE]: The "data" argument must be of type string or an instance of Buffer, TypedArray, or DataView. Received an instance of Promise
- 添加
await后报错:
TypeError [ERR_INVALID_ARG_TYPE]: The "data" argument must be of type string or an instance of Buffer, TypedArray, or DataView.(提示接收到数组)
相关流程:
- 从
ImagesNames数组遍历文件名 - 调用
detecText()提取图片文本,传入translateText() - 希望将翻译结果保存到对应文件名的TXT文件中
错误原因
- 初始错误:直接将
translateText(result)传入writeFileSync,但异步函数返回的是Promise对象,不是可直接写入的文本数据。 - 二次错误:
translateText函数内部处理后返回数组,而writeFileSync要求传入字符串/Buffer等类型,无法直接写入数组;同时原函数中forEach不会返回有效结果,函数默认返回undefined。
解决方案
1. 修正translateText函数,确保返回字符串类型
将翻译结果数组转为字符串(可根据需求用换行、逗号等分隔):
const target = "en"; const translateText = async function translateText(text) { let [translations] = await translate.translate(text, target); // 统一转为数组格式 translations = Array.isArray(translations) ? translations : [translations]; // 提取每个翻译项的文本(需根据translate返回的实际结构调整,若返回的是字符串则直接return translation) const translationTexts = translations.map(translation => { // 示例:若translation是包含translatedText属性的对象 return translation.translatedText || translation; }); // 将数组转为字符串,用换行分隔每个翻译结果 return translationTexts.join('\n'); };
2. 修正调用逻辑,确保传入正确的数据类型
ImagesNames.forEach((element) => { detecText(element) .then(async (result) => { const imagesdir = element.replace('public/', ''); const finaltextsave = imagesdir.replace('.jpg', '.txt'); // 等待翻译完成,获取字符串结果 const translatedText = await translateText(result); // 写入文件 fs.writeFileSync(finaltextsave, translatedText); }) .catch((err) => console.log(err + element)); });
关键说明
- 异步函数必须通过
await或.then()获取实际返回值,不能直接传入同步方法(如writeFileSync)。 writeFileSync仅接受字符串、Buffer等特定类型,需确保传入的数据符合要求,数组需先转为字符串。
内容的提问来源于stack exchange,提问作者kate moss
相关产品推荐
相关产品推荐

