Node.js写入CSV时调用类方法报is not a function错误如何解决
问题原因与解决方案
核心报错原因
this指向丢失:你给request方法传入的是普通匿名回调函数,普通函数的this会绑定到触发回调的调用方(此处为request请求实例),而非TidalDataService类的实例,因此无法识别类上定义的isHeader、writeDataIntoFile方法。- 异步方法未正确等待:
isHeader是异步方法,返回值为Promise<boolean>,未加await直接赋值的话,拿到的是Promise对象而非预期的布尔值,会导致后续文件写入逻辑出错。
修复方案
1. 替换普通回调为箭头函数
箭头函数不会创建独立的this上下文,会继承外层作用域的this(即类实例的this),修正firstExecuted方法的回调声明。
2. 给异步方法调用添加await
拿到异步方法的真实返回结果再执行后续逻辑。
3. 修正附带的逻辑错误
writeDataIntoFile方法中,isHeaderExist判断后的打印语句引用了不存在的err变量,需要删除该错误引用。
修正后的代码示例
import request = require('request'); import cheerio = require('cheerio'); import converter = require('json-2-csv'); import fs = require('fs'); import { promisify } from 'util'; // 可选:把回调式API转成Promise式,方便async/await统一管理异步逻辑 const accessAsync = promisify(fs.access); const writeFileAsync = promisify(fs.writeFile); const appendFileAsync = promisify(fs.appendFile); const json2csvAsync = promisify(converter.json2csv); export class TidalDataService { private readonly siteURL = "webpage.url"; private readonly filepath = 'data.csv'; public data = ""; public async firstExecuted() { // 回调改成箭头函数 request(this.siteURL, async (err, res, body) => { if (err) { console.error('请求失败:', err); return; } let $ = cheerio.load(body); var data = []; var dateIndex = []; // 爬取页面数据逻辑... console.log(data); try { // 加await拿到返回值 var isHeaderExist = await this.isHeader(); await this.writeDataIntoFile(data, isHeaderExist); } catch (err) { console.error('处理失败:', err); throw err; } }); } public async isHeader(): Promise<boolean> { try { await accessAsync(this.filepath, fs.constants.F_OK | fs.constants.W_OK); return true; } catch (err) { return false; } } public async writeDataIntoFile(data: object[], isHeaderExist: boolean) { const csv = await json2csvAsync(data); console.log(csv); if (isHeaderExist) { console.log(`${this.filepath} 已存在,执行写入`); await writeFileAsync(this.filepath, csv); } else { console.log(`${this.filepath} 不存在,执行追加`); await appendFileAsync(this.filepath, csv); } } }
内容的提问来源于stack exchange,提问作者hweiu321
相关产品推荐
相关产品推荐

