如何重构 Javascript 中的 API 代码?
How can I refactor API code in Javascript?
在 MEAN stack 项目中,这里有两种形式的 Express 函数:一种采用日期参数,另一种不采用,唯一的区别是第二个 URL 组件和 aws 方法名称.
-->我如何用所有代码定义 2 个函数,将 URL 组件作为参数,从中构造 aws 方法名称,然后 return Express 函数,从而减少我们需要维护的代码?
App.js 文件
API不带日期参数的
const AWS = require("../db/data"),
aws = new AWS("aws_" + config.db.release.set);
router.get('/data/quern', (req, res) => {
aws.getdataquern()
.then(
record => { res.status(200).send(record) },
error => { res.status(500).send(error) });
});
router.get('/data/quern1', (req, res) => {
aws.getdataquern1()
.then(
record => { res.status(200).send(record) },
error => { res.status(500).send(error) });
});
router.get('/data/quern2', (req, res) => {
aws.getdataquern2()
.then(
record => { res.status(200).send(record) },
error => { res.status(500).send(error) });
});
Api以日期为参数的
router.get('/data/withDate/:date', (req, res) => {
aws.getdatawithDate(req.params.date)
.then(
record => { res.status(200).send(record) },
error => { res.status(500).send(error) });
});
router.get('/data/withDate1/:date', (req, res) => {
aws.getdatawithDate1(req.params.date)
.then(
record => { res.status(200).send(record) },
error => { res.status(500).send(error) });
});
router.get('/data/withDate2/:date', (req, res) => {
aws.getdatawithDat2(req.params.date)
.then(
record => { res.status(200).send(record) },
error => { res.status(500).send(error) });
});
您可以对所有这些函数使用一个通用函数,将要调用的 aws 方法作为字符串传递,然后将要传递给该函数的任何参数传递给该函数。另外,请注意 .status(200)
不是必需的,因为它已经是默认状态。
const AWS = require("../db/data"),
aws = new AWS("aws_" + config.db.release.set);
function handleResponse(res, awsFnName, arg) {
aws[awsFnName](arg).then(
record => { res.send(record) },
error => { res.status(500).send(error) }
);
}
router.get('/data/quern', (req, res) => {
handleResponse(res, "getdataquern");
});
router.get('/data/quern1', (req, res) => {
handleResponse(res, "getdataquern1");
});
router.get('/data/quern2', (req, res) => {
handleResponse(res, "getdataquern2");
});
router.get('/data/withDate/:date', (req, res) => {
handleResponse(res, "getdatawithDate", req.params.date)
});
router.get('/data/withDate1/:date', (req, res) => {
handleResponse(res, "getdatawithDate1", req.params.date)
});
router.get('/data/withDate2/:date', (req, res) => {
handleResponse(res, "getdatawithDate2", req.params.date)
});
请注意,如果路由声明本身真的如此重复,它们可能会被 table 驱动,您可以通过迭代 table 参数在一个循环中生成所有路由。以下是路由本身的生成方式:
const AWS = require("../db/data"),
aws = new AWS("aws_" + config.db.release.set);
function handleResponse(res, awsFnName, arg) {
aws[awsFnName](arg).then(
record => { res.send(record) },
error => { res.status(500).send(error) }
);
}
["quern", "quern1", "quern2"].forEach(suffix => {
router.get(`/data/${suffix}`, (req, res) => {
handleResponse(res, `getdata${suffix}`);
});
});
["withDate", "withDate1", "withDate2"].forEach(suffix => {
router.get(`/data/${suffix}/:date`, (req, res) => {
handleResponse(res, `getdata${suffix}`, req.params.date);
});
});
此代码生成所有六个路由。
我并不总是非常喜欢生成的路由,因为代码的 reader 并不完全清楚该代码正在注册的路由。显然,通过研究代码是可以理解的,但是比上面第一种方法有一些维护优势,尽管它在代码上多了一点冗余。
在 MEAN stack 项目中,这里有两种形式的 Express 函数:一种采用日期参数,另一种不采用,唯一的区别是第二个 URL 组件和 aws 方法名称.
-->我如何用所有代码定义 2 个函数,将 URL 组件作为参数,从中构造 aws 方法名称,然后 return Express 函数,从而减少我们需要维护的代码?
App.js 文件
API不带日期参数的
const AWS = require("../db/data"),
aws = new AWS("aws_" + config.db.release.set);
router.get('/data/quern', (req, res) => {
aws.getdataquern()
.then(
record => { res.status(200).send(record) },
error => { res.status(500).send(error) });
});
router.get('/data/quern1', (req, res) => {
aws.getdataquern1()
.then(
record => { res.status(200).send(record) },
error => { res.status(500).send(error) });
});
router.get('/data/quern2', (req, res) => {
aws.getdataquern2()
.then(
record => { res.status(200).send(record) },
error => { res.status(500).send(error) });
});
Api以日期为参数的
router.get('/data/withDate/:date', (req, res) => {
aws.getdatawithDate(req.params.date)
.then(
record => { res.status(200).send(record) },
error => { res.status(500).send(error) });
});
router.get('/data/withDate1/:date', (req, res) => {
aws.getdatawithDate1(req.params.date)
.then(
record => { res.status(200).send(record) },
error => { res.status(500).send(error) });
});
router.get('/data/withDate2/:date', (req, res) => {
aws.getdatawithDat2(req.params.date)
.then(
record => { res.status(200).send(record) },
error => { res.status(500).send(error) });
});
您可以对所有这些函数使用一个通用函数,将要调用的 aws 方法作为字符串传递,然后将要传递给该函数的任何参数传递给该函数。另外,请注意 .status(200)
不是必需的,因为它已经是默认状态。
const AWS = require("../db/data"),
aws = new AWS("aws_" + config.db.release.set);
function handleResponse(res, awsFnName, arg) {
aws[awsFnName](arg).then(
record => { res.send(record) },
error => { res.status(500).send(error) }
);
}
router.get('/data/quern', (req, res) => {
handleResponse(res, "getdataquern");
});
router.get('/data/quern1', (req, res) => {
handleResponse(res, "getdataquern1");
});
router.get('/data/quern2', (req, res) => {
handleResponse(res, "getdataquern2");
});
router.get('/data/withDate/:date', (req, res) => {
handleResponse(res, "getdatawithDate", req.params.date)
});
router.get('/data/withDate1/:date', (req, res) => {
handleResponse(res, "getdatawithDate1", req.params.date)
});
router.get('/data/withDate2/:date', (req, res) => {
handleResponse(res, "getdatawithDate2", req.params.date)
});
请注意,如果路由声明本身真的如此重复,它们可能会被 table 驱动,您可以通过迭代 table 参数在一个循环中生成所有路由。以下是路由本身的生成方式:
const AWS = require("../db/data"),
aws = new AWS("aws_" + config.db.release.set);
function handleResponse(res, awsFnName, arg) {
aws[awsFnName](arg).then(
record => { res.send(record) },
error => { res.status(500).send(error) }
);
}
["quern", "quern1", "quern2"].forEach(suffix => {
router.get(`/data/${suffix}`, (req, res) => {
handleResponse(res, `getdata${suffix}`);
});
});
["withDate", "withDate1", "withDate2"].forEach(suffix => {
router.get(`/data/${suffix}/:date`, (req, res) => {
handleResponse(res, `getdata${suffix}`, req.params.date);
});
});
此代码生成所有六个路由。
我并不总是非常喜欢生成的路由,因为代码的 reader 并不完全清楚该代码正在注册的路由。显然,通过研究代码是可以理解的,但是比上面第一种方法有一些维护优势,尽管它在代码上多了一点冗余。