node.js - 如何从控制器中提取成功和错误响应
问题描述
我正在使用 nodejs、mongodb 和 express 创建 rest api。在每个成功响应和错误响应中,我都以自定义格式发送这些响应。但是这种格式是重复的,并且在每个 if else 和 try catch 块中我一遍又一遍地重复,控制器变得噪音和不可读。
我想在中央某处分离/提取该逻辑,例如将来如果我需要对该格式进行任何更改,我不需要在多个地方进行修改。请在下面找到登录功能。
**身份验证控制器 - **
var api_var = {
version: process.env.API_VERSION,
developer: process.env.API_DEVELOPER
};
exports.login = async (req, res) => {
var response_status = {};
var response_dataset = {};
var response_data = {};
const errors = validationResult(req);
try {
if (!errors.isEmpty()) {
const errorVal = errors.array();
response_dataset = errors.array();
response_status.message = errorVal[0].msg;
response_data.dataset = response_dataset;
(response_data.status = response_status), (response_data.publish = api_var);
res.status(process.env.HTTP_RESPONSE_BAD_REQUEST);
res.send({ response: response_data });
} else {
let { email, password } = req.body;
let user = await User.findOne({ email });
if(!user){
response_status.message = "There is no user associated with this email address!";
response_data.dataset = response_dataset;
(response_data.status = response_status),
(response_data.publish = api_var);
res.status(process.env.HTTP_RESPONSE_UNAUTHORIZED);
res.send({ response: response_data });
} else if (user.status == 'inactive'){
response_status.message = "Your Account is either disabled or removed!";
response_data.dataset = response_dataset;
(response_data.status = response_status),
(response_data.publish = api_var);
res.status(process.env.HTTP_RESPONSE_UNAUTHORIZED);
res.send({ response: response_data });
} else if(!global.Helpers.comparePassword(password, user.password)){
response_status.message = "The password is invalid or the user does not have a password!";
response_data.dataset = response_dataset;
(response_data.status = response_status),
(response_data.publish = api_var);
res.status(process.env.HTTP_RESPONSE_UNAUTHORIZED);
res.send({ response: response_data });
}else if(user.isVerified == false){
response_status.message = "Your Account is not varified. Please verify your Account!";
response_data.dataset = response_dataset;
(response_data.status = response_status),
(response_data.publish = api_var);
res.status(process.env.HTTP_RESPONSE_UNAUTHORIZED);
res.send({ response: response_data });
} else {
let userDetails = {
id: user._id,
email: user.email,
name: user.name,
role: user.role
};
let Token = global.Helpers.createToken(userDetails);
user_details = {
token : Token,
user : {
role: user.role,
name: user.name,
email: user.email,
_id: user._id
}
}
response_status.message = "Well Done, You Successfully Logged In to pawsticks!";
response_data.dataset = user_details;
(response_data.status = response_status),
(response_data.publish = api_var);
res.status(process.env.HTTP_RESPONSE_OK);
res.send({ response: response_data });
}
}
} catch (error) {
response_dataset = error;
response_status.message = error.message;
response_data.dataset = response_dataset;
(response_data.status = response_status), (response_data.publish = api_var);
res.status(process.env.HTTP_RESPONSE_INTERNAL_SERVER_ERROR);
res.send({ response: response_data });
}
}
在我当前的实现中,api_var 对象和 response_status、response_dataset、response_data 是重复的。我怎样才能清理这个烂摊子。
解决方案
您可以抛出自定义错误并在错误中间件中捕获,从那里您可以返回相同的逻辑。错误响应。
基本样本
const express = require("express");
const app = express();
class ResponseError {
constructor(status) {
this.status = status;
}
}
function resError(err, req, res, next) {
if(err instanceof ResponseError) {
// Logic here
res.status(400).send('Logic break')
}else {
res.status(500).send('Something broke!')
}
}
app.route("/book/:id").get(function(req, res) {
if (req.params.id == 2) throw new ResponseError(400);
console.log(req.params);
res.send("Get a random book");
});
app.route("/user/:id").get(function(req, res) {
if (req.params.id == 2) throw new ResponseError(400);
console.log(req.params);
res.send("USER");
});
app.use(resError)
app.listen(3000);
推荐阅读
- c++ - 'null' 和 'NULL' 是一样的吗?
- google-cloud-platform - 在 bigquery UDF 中使用 SQL
- symfony4 - 如何在 Symfony4 上使用带小数的 ICU 选择?
- git - 如何将私人组织的 Git 存储库与公共 GitHub 同步?
- mysql - 如何按值获取分组列计数
- heap-memory - 带有python的Nifi ExecuteScript:OOM异常
- c - 结构填充和性能损失
- node.js - Postgres sql脚本在nodejs中管理数据库
- c# - 在单独的类库中使用实体框架核心 dbcontext 的脚手架 asp.net razor 页面出现问题
- angular - 单元测试中的错误(业力)。没有将“exportAs”设置为“ngbPopover”的指令