NodeJS 및 KnexJS를 사용하여 데이터를 저장하는 다양한 방법

구조는 다르지만 비슷한 아이디어로 많은 함수를 만들었습니다. 그중 하나는 데이터를 데이터베이스에 저장하는 것입니다.

접근법 1:

async store ({ firstName, lastName }) {
  try {
    const [id] = await knex('users')
      .insert({
        first_name: firstName,
        last_name: lastName
      })

    return id
  } catch (error) {
    throw error
  }
}


용법:

await store({
    firstName: 'Ernie Jeash',
    lastName: 'Villahermosa'
})


그러나이 접근 방식은 열 수가 증가하면 지저분해집니다.

접근 2:

async store (payload) {
  try {
    const [id] = await knex('users')
      .insert(payload)

    return id
  } catch (error) {
    throw error
  }
}


용법:

await store({
    first_name: 'Ernie Jeash',
    last_name: 'Villahermosa'
})


두 번째 접근 방식은 복잡하게 만들지 않고 배열과 개체를 모두 허용하지만 인식할 수 없는 열이 있는 경우 취약하고 쉽게 오류를 생성합니다.

접근법 3

const _pickBy = require('lodash/pickBy')

async store (payload) {
  try {
    const fillables = ['first_name', 'last_name']

    const [id] = await knex('users')
      .insert(_pickBy(payload, col => fillables.includes(col)))

    return id
  } catch (error) {
    throw error
  }
}


용법:

await store({
    first_name: 'Ernie Jeash',
    last_name: 'Villahermosa'
})


이 접근 방식은 두 번째 접근 방식과 비슷하지만 등록되지 않은 속성이 생략되기 때문에 오류가 발생하기 쉽습니다. 그러나 객체만 허용합니다. 충분히 다재다능하지 않습니다.

최종 접근

const _castArray = require('lodash/castArray')
const _pickBy = require('lodash/pickBy')
const _isNil = require('lodash/isNil')

async store (payload) {
  const fillables = new Set([
    'user_id',
    'admin_id'
  ])

  try {
    const data = _castArray(payload)
      .map(hay => _pickBy(hay, (val, key) => {
        return !_isNil(val) && fillables.has(key)
      }))

    const [id] = await store.knex('users').insert(data)

    return id
  } catch (error) {
    throw error
  }
}


용법:

await store({
    first_name: 'Ernie Jeash',
    last_name: 'Villahermosa'
})

// or

await store([
    {
        first_name: 'Ernie Jeash',
        last_name: 'Villahermosa'
    },
    {
        first_name: 'Marielle Mae',
        last_name: 'Valdez'
    }
])


이 접근 방식은 조회 속도가 더 빠른 ES6Set를 활용합니다. 배열과 객체를 모두 허용합니다. 동시에 이전 접근 방식의 문제를 해결한 미등록 속성을 생략합니다. 나는 또한 lodash의 몇 가지 기능을 사용했습니다.

추신: 새로운 제안에 열려 있습니다 😊

좋은 웹페이지 즐겨찾기