我有一个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的正确方法是什么?
答案 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");
}
});
如果路由处理程序需要在多个地方以某些变体重用,则可以将其重构为高阶函数或其他知道原始req
和res
参数的帮助程序。 / 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");
}
});