Javascript 在NodeJS中获取未处理的承诺拒绝警告

Javascript 在NodeJS中获取未处理的承诺拒绝警告,javascript,node.js,express,promise,async-await,Javascript,Node.js,Express,Promise,Async Await,我想知道为什么我得到了这个错误/警告,即使我的代码看起来还行 以下是我开始构建的用户模型: const fs = require('fs'); class UserModel { constructor(filename) { if (!filename) { throw new Error('Require a filename...'); } this.file = filename; try{

我想知道为什么我得到了这个错误/警告,即使我的代码看起来还行

以下是我开始构建的用户模型:

const fs = require('fs');

class UserModel {
    constructor(filename) {
        if (!filename) {
            throw new Error('Require a filename...');
        }
        this.file = filename;
        try{
            fs.accessSync(this.file);   //to check if the file exists already   
        } catch (err) {                 //if not, make a new file
            fs.writeFileSync(this.file, ['']);             
        }
    }

    async getAll() {    
        return JSON.parse(await fs.promises.readFile(this.file,{
            encoding: 'utf8'
        }));
    }
}

//to test the above code
const test = async () => {
    const user = new UserModel('users.json');
    const data = await user.getAll();
    console.log(data);
}
test();


请帮助,新到的NodeJS世界

正如评论所说,您应该在getAll中设置一个try/catch来代替wait。像这样:

const fs = require('fs');

class UserModel {
    constructor(filename) {
        if (!filename) {
            throw new Error('Require a filename...');
        }
        this.file = filename;
        try{
            fs.accessSync(this.file);   //to check if the file exists already   
        } catch (err) {                 //if not, make a new file
            fs.writeFileSync(this.file, ['']);             
        }
    }

    async getAll() {
        return JSON.parse(await fs.promises.readFile(this.file,{
            encoding: 'utf8'
        }));
    }
}

//to test the above code
const test = async () => {
    const user = new UserModel('users.json');
    try {
        const data = await user.getAll();
        console.log(data);
    } catch (error) {
        // handle error
        console.log(error.stack)
    }
}
test();

使用test.catchconsole.error,或者在测试函数中的getAll调用周围放置try/catch。由于测试函数而得到警告。不,我的评论建议它应该放置在getAll调用周围,而不是getAll函数内部。您还删除了json parsingGood调用。编辑了答案。这种方法还应该处理未处理的承诺拒绝警告。@psehgal Bergi建议将错误处理移到getAll之外的要点是分离关注点。getAll方法不知道,也不应该知道应该如何处理错误,只有调用方知道,因此调用方应该处理错误。你也在以这种方式复制错误处理,因为假设内部错误得到处理,getAll返回承诺,测试中的数据变得未定义,这会导致另一个错误,无限大。啊,是的,我明白你的意思。是的,我同意这是一个更好的设计。我将为OP更新我的答案。