gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 22:57:49 26 4
gpt4 key购买 nike

我有一个 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com