调用objects-to-csv导出CSV报错TypeError: fs.existsSync is not a function
报错原因
TypeError: fs.existsSync is not a function 报错的核心原因是运行环境不匹配:
objects-to-csv库的toDisk方法底层依赖Node.js内置的fs(文件系统)模块,该模块是Node服务端环境独有的系统API,浏览器出于安全沙箱限制,不提供直接操作用户本地磁盘的能力,自然不存在fs.existsSync方法。- 你当前把CSV写入逻辑写在了前端组件的方法中,这段代码最终会被打包后在用户的浏览器环境执行,根本无法调用Node端的文件系统能力,点击按钮触发逻辑时就会抛出该错误。
解决方案
根据你的实际需求二选一即可:
场景1:纯前端项目,需要点击按钮直接下载CSV到用户本地
不需要调用toDisk写磁盘方法,改用库生成CSV字符串的能力,在前端通过Blob对象触发浏览器原生下载即可,修改后的代码如下:
const ObjectsToCsv = require('objects-to-csv'); export default { data () { return { tableData: [ {code: 'CA', name: 'California'}, {code: 'TX', name: 'Texas'}, {code: 'NY', name: 'New York'}, ], } }, methods: { async exportData(){ const csv = new ObjectsToCsv(this.tableData); // 生成CSV格式字符串,不调用服务端专属的磁盘写入方法 const csvString = await csv.toString(); // 构造Blob触发浏览器下载 const blob = new Blob([csvString], { type: 'text/csv;charset=utf-8;' }); const tempLink = document.createElement('a'); tempLink.href = URL.createObjectURL(blob); tempLink.download = 'file.csv'; document.body.appendChild(tempLink); tempLink.click(); document.body.removeChild(tempLink); URL.revokeObjectURL(tempLink.href); console.log('导出成功') }, } }
注意:原代码中data返回值里的属性名也叫
data,容易和Vue组件本身的data选项产生命名冲突,上面示例里已经改名为tableData。
场景2:需要把CSV文件写入服务端本地磁盘
将toDisk相关的CSV生成、文件写入逻辑全部迁移到Node.js服务端的接口中实现,前端点击按钮时只需要发起请求调用对应接口,由服务端完成文件写入操作即可,不要把这段依赖Node API的逻辑放在前端组件代码中执行。
内容的提问来源于stack exchange,提问作者Barre Mathis
相关产品推荐
相关产品推荐

