NodeJS 引发错误以包括http状态代码

vi4fp9gy  于 2022-11-04  发布在  Node.js
关注(0)|答案(1)|浏览(146)

我写了一个API,将服务和控制器分开。在我的服务函数中,我定义了简单的检查,如果遇到错误就会抛出错误。我的控制器函数现在为每个抛出的错误返回一个500的状态代码。有没有一种方法可以在使用我使用的逻辑抛出错误时指定HTTP代码?
控制器功能:

export const login = async (req: Request, res: Response) => {
    const { email, password } = req.body;

    try {
        const { accessToken, refreshToken } = await loginUser(email, password);

        res.cookie('jwt', refreshToken, { httpOnly: true, secure: true });

        return res.status(200).json({ accessToken });
    } catch (error) {
        return res.status(500).json({ error });
    }
};

服务功能:

export const loginUser = async (email: string, password: string) => {
    if (!email || !password) {
        throw new Error('All fields are required');
    }

    const user = await findUser(email);

    if (!user) {
        throw new Error('User does not exist');
    }

    const isValid = validPassword(password, user.password.salt, user.password.hash);

    if (isValid) {
        const { refreshToken, accessToken } = issueJWT(user._id);

        return { refreshToken, accessToken };
    } else {
        throw new Error('You entered the wrong password');
    }
};
9q78igpj

9q78igpj1#

您可以创建一个函数,该函数接受消息、statusCode和数据,并使用提供的信息创建一个错误,如下所示:

module.exports.generateError = (message, statusCode, data) => {
    const error = new Error(message);
    error.statusCode = statusCode;
    error.data = data || {};
    error.error = true;
    return error
}

而且每次都可以调用:

throw generateError('You entered the wrong password',400);

而不是:

throw new Error('You entered the wrong password');

相关问题