node.js - 对employeeID 和employeeName 使用相同代码的动态方式
问题描述
我有这个项目是为了返回“员工的截图”,我设置了 api 来返回截图:
http://localhost:3000/employee/screenshot/14ll0a54kb9kkvh8?page=5
员工 ID="14ll0a54kb9kkvh8"................................................ ,并且使用此 api,我传递了员工 ID 和邮递员返回此员工的屏幕截图,代码在底部,但无论如何我想将“员工姓名”而不是“员工 ID”传递给 api,那么如何“以动态方式”将这个东西添加到代码中,这意味着不返回编写所有相同的代码?我需要有两个具有相同代码的 api,第一个带有 id 的 api 和第二个带有名称的 api:
http://localhost:3000/employee/screenshot/14ll0a54kb9kkvh8?page=5
http://localhost:3000/employee/screenshot/George?page=5
截图服务.js:
async getAll(employeeId, pageNumber, pageSize) {
// Grab images from db according to pagination data and uid
const dbImages = await ScreenshotModel
.findAndCountAll({
where: {
employeeId: employeeId
},
limit: pageSize,
offset: (pageNumber - 1) * pageSize
})
.then(screenshots => {
// console.log(dbRes);
const imagesData = [];
for (let i = 0; i < screenshots.rows.length; i++) {
imagesData.push(screenshots.rows[i]['dataValues']);
}
return imagesData;
})
.catch(dbError => {
console.log(dbError);
return null;
});
if (dbImages === null) return dbImages;
// Database returns images paths
// Now we need to get the actual images from files
// getting images paths from db response
const imagePaths = [];
for (let i = 0; i < dbImages.length; i++) {
imagePaths.push(dbImages[i]['imagePath']);
}
const directoryPath = rootDirectory + `/images/screenshots/${employeeId}`;
// Grabbing images from files
return await ScreenshotModel
.findAllInDirectoryWithSpecifiedImagePaths(directoryPath, imagePaths)
.then(readFromDirectoryResponse => {
return readFromDirectoryResponse;
})
.catch(readFromDirectoryError => {
console.log(readFromDirectoryError);
return null;
});
}
module.exports = ScreenshotService;
screenshotController.js:
const _getAll = async (req, res) => {
// Grabbing data
const employeeId = req.params['id'];
// Pagination data
const pageNumber = +req.query['page'];
const pageSize = 3;
// console.log(uid);
// console.log(pageNumber);
const screenshots = await ScreenshotService.Instance.getAll(employeeId, pageNumber,
pageSize);
if(screenshots === null)
return res.status(500).json({message: 'failed', screenshots: screenshots});
return res.status(200).json({message: 'succeeded', screenshots: screenshots});
};
module.exports = {
getAll: _getAll
};
解决方案
最好的解决方案应该是将入口点(端点)分开并接收不同的参数值,然后每个端点都转到一个公共函数。
其他解决方案是编写一个正则表达式,然后您可以确定传入的值是 id 还是名称。
编辑:
screenshotController.js:
const criteriaRegex = new RegExp('^(?=.*[0-9])(?=.*[a-zA-Z])([a-zA-Z0-9]+)$'); // define this in a global place
const _getAll = async (req, res) => {
const filter = {};
// Grabbing data
const critieria = req.params['id'];
if (criteriaRegex.test(critieria)){ // if true is because the ID is alphanumeric, thus, we assume this is an ID
filter = {employeeId: critieria}
} else {
filter = {employeeName: critieria}
}
// Pagination data
const pageNumber = +req.query['page'];
const pageSize = 3;
// console.log(uid);
// console.log(pageNumber);
const screenshots = await ScreenshotService.Instance.getAll(filter, pageNumber,
pageSize);
if(screenshots === null)
return res.status(500).json({message: 'failed', screenshots: screenshots});
return res.status(200).json({message: 'succeeded', screenshots: screenshots});
};
module.exports = {
getAll: _getAll
};
截图服务.js:
async getAll(filter, pageNumber, pageSize) {
// Grab images from db according to pagination data and uid
const dbImages = await ScreenshotModel
.findAndCountAll({
where: {
...filter
},
limit: pageSize,
offset: (pageNumber - 1) * pageSize
})
.then(screenshots => {
// console.log(dbRes);
const imagesData = [];
for (let i = 0; i < screenshots.rows.length; i++) {
imagesData.push(screenshots.rows[i]['dataValues']);
}
return imagesData;
})
.catch(dbError => {
console.log(dbError);
return null;
});
if (dbImages === null) return dbImages;
// Database returns images paths
// Now we need to get the actual images from files
// getting images paths from db response
const imagePaths = [];
for (let i = 0; i < dbImages.length; i++) {
imagePaths.push(dbImages[i]['imagePath']);
}
const directoryPath = rootDirectory + `/images/screenshots/${employeeId}`;
// Grabbing images from files
return await ScreenshotModel
.findAllInDirectoryWithSpecifiedImagePaths(directoryPath, imagePaths)
.then(readFromDirectoryResponse => {
return readFromDirectoryResponse;
})
.catch(readFromDirectoryError => {
console.log(readFromDirectoryError);
return null;
});
}
module.exports = ScreenshotService;
推荐阅读
- security - 在 IE 和 burp 套件中设置代理后 url 不加载
- android - GoogleAPI 拒绝应用程序 Artifact 升级问题
- angular-material - 角度材料垫网格列表未在高度上扩展
- python - 从 elasticsearch 获取流数据
- javascript - 获取点击项目的文本
- android - 我有这个 json 响应....我想将它添加到我的 android 微调器中?我如何添加这个
- python - split_on_silence 修改原始音频
- vector - \下划线在 MathJax 中显得太低
- angular6 - 当我尝试使用角度防护根据用户角色进行路由时,浏览器冻结
- javascript - 如果没有数据,如何隐藏 DataTables 导出按钮?