node.js - 弄清楚 promise 遭到拒绝的正确方法是什么?

标签 node.js mongodb express mongoose promise

我有一个 API/Express 路由器:

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 错误。这是我的 Controller :

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,正确的方法是什么?

最佳答案

Mongoose 已经使用了 Promise,使用 new Promise 是 Promise 构造反模式。

Express没有 Controller 的概念,只有路由处理程序和中间件。由于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 参数。

关于node.js - 弄清楚 promise 遭到拒绝的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55385052/

相关文章:

javascript - 获取路由中的内容 - Nodejs

javascript - 尝试建立 Angular 项目时的业力问题

html - 从 mongoDB 中获取数据并显示在 HTML 上

node.js - 如何在 NodeJS 中使用 TypeScript - `require` 问题

java - 何时在 lucene 中进行索引

node.js - 使用 React Hook Form 不可编辑字段

javascript - "Direct Response with Node.js"- 使用不同的 Node.js 进程发送 HTTP 响应(不同于主进程)

javascript - 使用 JWT 授权从 express node.js 下载文件

node.js - 如何在使用 npm run 运行端到端测试之前启动 Node 服务器?

Node.js 应用程序未在 AWS Elastic Beanstalk 上运行