首页 > 解决方案 > 对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
      };

标签: node.js

解决方案


最好的解决方案应该是将入口点(端点)分开并接收不同的参数值,然后每个端点都转到一个公共函数。

其他解决方案是编写一个正则表达式,然后您可以确定传入的值是 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;


推荐阅读