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

如何在类方法内部正确调用自身?解决this指向报错问题

问题解决:this.checkDB is not a function

错误原因及修复要点

  • this指向异常:fs.readdir的普通函数回调会重新绑定this,导致回调内的this不再指向DataHandler实例,无法访问checkDB方法。
  • 赋值操作误用为判断:err.code = 'ENOENT'是赋值语句,而非判断错误类型的比较,应改为严格相等===。
  • 未正确递归调用:原代码仅返回checkDB函数引用,未执行调用,且未处理递归后的Promise状态传递。
  • Promise未正常结束:fs.readdir成功时未调用resolve,导致Promise一直处于pending状态。

修复后的代码(回调版本)

const fs = require('fs');
const writeFileAtomic = require('write-file-atomic');

class DataHandler {
    constructor() {
    }

    checkDB() {
        return new Promise((resolve, reject) => {
            // 改用箭头函数保留外层this指向
            fs.readdir('./database', (err, files) => {
                if (err) {
                    // 严格相等判断错误类型
                    if (err.code === 'ENOENT') {
                        fs.mkdir('./database', (mkdirErr) => {
                            if (mkdirErr) {
                                return reject(mkdirErr);
                            }
                            // 递归调用并传递Promise状态
                            this.checkDB().then(resolve).catch(reject);
                        });
                    } else {
                        reject(err);
                    }
                } else {
                    console.log(files);
                    resolve(files); // 成功时结束Promise
                }
            });
        });
    }
}

module.exports = DataHandler;

更简洁的async/await版本

利用fs.promisesAPI简化代码,避免回调地狱和this指向问题:

const fs = require('fs').promises;
const writeFileAtomic = require('write-file-atomic');

class DataHandler {
    constructor() {
    }

    async checkDB() {
        try {
            const files = await fs.readdir('./database');
            console.log(files);
            return files;
        } catch (err) {
            if (err.code === 'ENOENT') {
                await fs.mkdir('./database');
                return this.checkDB(); // 递归调用
            }
            throw err;
        }
    }
}

module.exports = DataHandler;

内容的提问来源于stack exchange,提问作者Bob Boby

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 18:50:33