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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 11:18:03