Javascript 如何处理返回404状态的承诺?

Javascript 如何处理返回404状态的承诺?,javascript,node.js,Javascript,Node.js,我有一个方法,它使用node fetch进行POST调用,通过API更新表中的概要文件对象。如果提供了无效的profileId(状态404),承诺仍会解决。最好的处理方法是什么,这样我只能接受状态200?该方法定义为: async function updateUserProfileSocketId(profileId, socketId) { const body = { id: profileId, socketId }; try { const respon

我有一个方法,它使用node fetch进行POST调用,通过API更新表中的概要文件对象。如果提供了无效的profileId(状态404),承诺仍会解决。最好的处理方法是什么,这样我只能接受状态200?该方法定义为:

async function updateUserProfileSocketId(profileId, socketId) {
    const body = { id: profileId, socketId };
    try {
        const response = await fetch(`${API_URL}/updateUserProfile`, {
            method: 'post',
            body: JSON.stringify(body),
            headers: { 'Content-Type': 'application/json' },
        });

        if (response.status !== 200) {
            throw new Error(response.status);
        }
    } catch (err) {
        console.log(`updateUserProfileSocketId Error: ${err}`);
    }
}
在服务类中调用该方法,如下所示:

onInit(socket) {
    socket.on('init', (profile) => {
        Promise.resolve(updateUserProfileSocketId(profile.id, socket.id))
            .then((response) => {
                if (response === null || response === undefined) {
                    console.log(`Unable to find profile ${profile.id}`);
                    socket.conn.close();
                } else {
                    users.push(profile.id);
                }
            })
            .catch((err) => {
                console.log(err);
            });
    });
}

这似乎有效,但我不确定这是否是最好的处理方法。有什么想法吗?

如果响应状态不是200,则抛出一个异常,该异常将立即再次被捕获。这可能不是你想要的。您可以出于日志记录的目的保留catch块,但应重新显示异常:

async function updateUserProfileSocketId(profileId, socketId) {
    const body = { id: profileId, socketId };
    try {
        const response = await fetch(...);

        if (response.status !== 200) {
            throw new Error(response.status);
        }
    } catch (err) {
        console.log(`updateUserProfileSocketId Error: ${err}`);
        throw err;
    }
}
同样的事情也适用于套接字回调中的catch处理程序。
但是,删除try/catch/log/rethrow逻辑并集中处理异常会更干净。

删除捕获是个好主意。。否则,您已经吞并了异常。再次抛出它不意味着它只在终端上出现两次吗?更重要的是,抛接球不是一种坏习惯吗?没错,我只是想指出,如果你想保留try/cacht的球,该怎么办。另请注意,有些情况下这很好,请参阅以下有趣的帖子: