弄清楚诺言有什么拒绝的正确方法?

时间:2019-03-27 19:25:38

标签: node.js mongodb express mongoose promise

我有一个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的正确方法是什么?

2 个答案:

答案 0 :(得分:2)

猫鼬已经在使用诺言,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参数的帮助程序。 / p>

答案 1 :(得分:1)

您可以更改拒绝承诺的方式。我建议像这样:

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

    });
}

在路线中:

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(e).json(e == 400 ? "Username already exists." : "DB Error");
    }
});