Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 空气污染指数->;创建可重用的函数来获取所有_Javascript_Node.js_Postgresql_Rest - Fatal编程技术网

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)
}