我有一个API /快速路由器:

router.post("/signup", async function (req, res) {
    try {
        var user = await controllers.user.register(req.body.username, req.body.password);
        req.session.user = user;
        res.json(user);
    } catch (e) {
        res.status(500).json("DB Error");
    }
});


当前,如果发生错误,它将返回500 DB错误。这是我的控制器:

function register(username, password) {
    return new Promise((resolve, reject) => {
        User.findOne({ username: username }).lean().exec((e, doc) => {
            if (e) reject(e);
            if (doc) {
                reject("Username already exists.");
            } else {
                var user = new User({ username, password: hash(password) });
                user.save((e) => {
                    if (e) reject(e);
                    else {
                        delete user.password;
                        resolve(user);
                    }
                });
            }
        });

    });
}


如果用户名已经存在,返回400的正确方法是什么,如果数据库错误,则返回500的正确方法是什么?

最佳答案

猫鼬已经使用了诺言,new Promise的使用是诺言构造反模式。

Express没有控制器的概念,只有路由处理程序和中间件。由于register应该非常了解将其用于响应中的方式,因此可能不需要在路由处理程序之上进行另一级抽象。当一个函数可以访问处理程序参数并且可以就地形成响应时,将没有问题。

有可能:

router.post("/signup", async function (req, res) {
    try {
        const { body, password } = req.body;
        const user = await User.findOne({ username: username }).lean();
        if (user) {
          res.status(400).json("Username already exists");
        } else {
          ...
          res.json(user);
        }
    } catch (e) {
        res.status(500).json("DB Error");
    }
});


如果路由处理程序需要在多个地方以某些变体重用,则可以将其重构为高阶函数或其他知道原始reqres参数的帮助程序。

10-07 14:39