Javascript 空气污染指数->;创建可重用的函数来获取所有
亲爱的,Javascript 空气污染指数->;创建可重用的函数来获取所有,javascript,node.js,postgresql,rest,Javascript,Node.js,Postgresql,Rest,亲爱的, 我只是想知道是否有可能创建一个以SQL查询为参数并继续处理请求的函数。考虑两项职能: async addExpense(req, res){ const addExpense ='INSERT INTO budget.expenses_category_assigned_to_user VALUES(DEFAULT, $1, $2)' if(!req.body.name){ return res.status(400).send({message: '
我只是想知道是否有可能创建一个以SQL查询为参数并继续处理请求的函数。考虑两项职能:
async addExpense(req, res){
const addExpense ='INSERT INTO budget.expenses_category_assigned_to_user VALUES(DEFAULT, $1, $2)'
if(!req.body.name){
return res.status(400).send({message: 'Expense cannot be added. Name is missing'})
}
const queryValues = [
req.user.id,
req.body.name
]
try{
await db.query(addExpense, queryValues)
return res.status(200).json({message: 'Expense has been successfully added'})
}catch(err){
return res.status(400).send({message: err})
}
}
尽管存在一些差异,但它们很容易标准化,唯一可以更改的参数是查询和查询值。请告知是否可以在Node和postgres中创建此功能:
foo(query, queryParams){
action
}
哪个将继续处理请求,并可用于多个端点?这样做的目的是避免冗余并保留RESTAPI功能。在一个端点中为不同的表动态生成查询不是一个好主意。当其中一个表添加/删除了列时,您将来可能会遇到困难,您可能很难维护这段代码,并且在修复此查询时可能会中断另一个查询谢谢您的澄清,事实上我误解了您的问题。我的想法基本上如下
- 将查询分离为单独的查询
- 根据从endpoint entry函数传入的参数“table”,在“addOne”函数中调用相应的查询
- 使用“addOne”函数中定义的正确参数在端点中调用“addOne”函数
async addExpense(req, res){
addOne(req, res, 'Expense')
}
async addPaymentMethod(req, res){
addOne(req, res, 'Payment method')
}
async function addOne(req, res, table) {
if(!req.body.name){
return res.status(400).send({message: 'Expense cannot be added. Name is missing'})
}
try{
switch (table) {
case 'Expense':
await addExpensesQuery(req)
break;
case 'Payment method':
await addPaymentQuery(req)
break;
default:
throw new Error('Unsupported operation')
}
return res.status(200).json({message: `${table} has been successfully added`})
}catch(err){
return res.status(400).send({message: err})
}
}
function addExpensesQuery (req) {
const addExpense ='INSERT INTO budget.expenses_category_assigned_to_user VALUES(DEFAULT, $1, $2)'
const queryValues = [
req.user.id,
req.body.name
]
return db.query(addExpense, queryValues)
}
function addPaymentQuery (req) {
const addQuery = 'INSERT INTO budget.payment_methods_assigned_to_user VALUES (DEFAULT, $1, $2)'
const queryValues = [
req.user.id,
req.body.name
]
return db.query(addQuery, queryValues)
}
J先生的想法不是动态生成查询,而是避免创建类似的函数。根据我的示例,您可以看到一般的区别是不同的SQL查询以及向查询传递不同参数的可能性。其余的完全一样。我想知道是否有可能有函数addOne(它总是会添加一个东西,如费用、收入、付款方式)。主体总是非常相似的。只有两个区别是params和query。现在清楚了吗?
async addExpense(req, res){
addOne(req, res, 'Expense')
}
async addPaymentMethod(req, res){
addOne(req, res, 'Payment method')
}
async function addOne(req, res, table) {
if(!req.body.name){
return res.status(400).send({message: 'Expense cannot be added. Name is missing'})
}
try{
switch (table) {
case 'Expense':
await addExpensesQuery(req)
break;
case 'Payment method':
await addPaymentQuery(req)
break;
default:
throw new Error('Unsupported operation')
}
return res.status(200).json({message: `${table} has been successfully added`})
}catch(err){
return res.status(400).send({message: err})
}
}
function addExpensesQuery (req) {
const addExpense ='INSERT INTO budget.expenses_category_assigned_to_user VALUES(DEFAULT, $1, $2)'
const queryValues = [
req.user.id,
req.body.name
]
return db.query(addExpense, queryValues)
}
function addPaymentQuery (req) {
const addQuery = 'INSERT INTO budget.payment_methods_assigned_to_user VALUES (DEFAULT, $1, $2)'
const queryValues = [
req.user.id,
req.body.name
]
return db.query(addQuery, queryValues)
}