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