API -> создать повторно используемую функцию для getAll - PullRequest
0 голосов
/ 29 марта 2020

Уважаемые,
Мне просто интересно, возможно ли создать одну функцию, которая принимает 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})
    }
}
async addPaymentMethod(req, res){
    const addQuery = 'INSERT INTO budget.payment_methods_assigned_to_user VALUES (DEFAULT, $1, $2)'

    if(!req.body.name){
        return res.status(400).send({message: 'Payment method has not been added'})
    }

    try{
        const queryParams = [
            req.user.id,
            req.body.name
        ]

        await db.query(addQuery, queryParams)
        return res.status(200).send({message: `${req.body.name} has been added`})
    }catch(err){
        return res.status(400).send({message: err})
    }
}

Несмотря на некоторые различия, их можно легко стандартизировать, и единственным параметром, который может быть изменен, являются query и queryValues.
Не могли бы вы сообщить, возможно ли это в Node и postgres для создания такой функции:

foo(query, queryParams){
 action
}

, которая будет обрабатывать запрос и может быть повторно использована для нескольких конечных точек?
Идея состоит в том, чтобы избежать избыточности и сохранить функциональные возможности API REST

Ответы [ 2 ]

1 голос
/ 30 марта 2020

Спасибо за разъяснения, действительно я неправильно понял ваш вопрос. Моя идея ниже в основном

  • разделить запрос на отдельные
  • вызов соответствующего запроса в функции '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)
}

0 голосов
/ 29 марта 2020

IMO - не очень хорошая идея динамически генерировать запрос для разных таблиц в одной конечной точке. В будущем у вас могут возникнуть трудности, когда в одну из таблиц добавлены / удалены столбцы, вам может быть сложно поддерживать этот фрагмент кода, и вы можете нарушить другой запрос при исправлении этого запроса

...