>

데이터베이스가 아닌 JavaScript로 완전히 만들어진 응용 프로그램을 만들고 있는데 응용 프로그램을위한 간단한 사용자 관리 시스템을 만들었습니다.

이 사용자 관리 시스템은 몇 가지 명령 줄 인수를 기반으로 사용자 정보 (데이터베이스에 쿼리가 아닌 사용자 정보가 포함되어 있음)가 포함 된 데이터베이스에 쿼리를 생성하고 데이터베이스의 데이터를 해독 한 다음 결과를 콘솔.

2 년 동안 프로그래밍을 해왔지만, 독학으로 내 코드에 대한 피드백/비판을 찾고있었습니다.

참고 :기본 스크립트의 일부 모듈은 포함되어 있지 않지만 대부분의 기능은 직관적이어야합니다.

DataBase 에 대한 자세한 내용은

수정 :  수업은 이 질문을 참조하십시오.

내 코드는 다음과 같습니다 :

메인 스크립트 :
// this is a instance of a `DataBase` class:
const users = require('../../Code/MiddleWare/Database-comms/createUser').users
const lookup = require('./lookup')
const decryptAll = require('./decrypt')
void async function() {
  if(process.argv[2] === '-e') {
    console.dir(decryptAll(await lookup('Email', process.argv[3], users, process.argv[4] === '-ex')), {colors: true, depth: Infinity})
  } else if(process.argv[2] ? process.argv[2].match(/^\d+$/) : false) {
    console.dir(decryptAll(await lookup('ID', parseInt(process.argv[2]), users, process.argv[3] === '-ex', false)), {colors: true, depth: Infinity})
  } else {
    console.dir(decryptAll(await lookup('Username', process.argv[2] ? process.argv[2] : '', users, process.argv[3] === '-ex')), {colors: true, depth: Infinity})
  }
}()

"조회"모듈 :
module.exports = async function(type, string, users, exact,  encrypted = true) {
  const aes = require('../../Code/MiddleWare/Security/index').encryption.AES
   const retval = []
   await users.query('Users').then((data) => {
     for(let i of data) {
        if(encrypted ? (exact? aes.decrypt(i[type]) === string : aes.decrypt(i[type]).match(string)) : i[type] === string) {
          retval.push(i)
        }
     }
   })
   return retval.length === 0 ? false : retval
}

"암호 해독"모듈 :
const decrypt = require('../../Code/MiddleWare/Security/encryption').AES.decrypt
module.exports = function(array) {
  if(!array) {
    return false    
  }
  const retval = []
  function decryptAll(obj) {
    return {ID: obj.ID, Username: decrypt(obj.Username), Email: decrypt(obj.Email), Data: decrypt(obj.Data), Password: obj.Password}
  }
  for(const i of array) {
    const item = decryptAll(i)
    item.Data = JSON.parse(item.Data)
    retval.push(item)
  }
  return retval
}


  • 답변 # 1

    메인 스크립트

    commander 를 사용해보십시오. 모듈. 당신이 얻는 한 가지 이점은 당신을 위해 논쟁을 파싱한다는 것입니다. 다른 하나는 인수와 옵션을 선언하는 API가 --help 를 자동 생성한다는 것입니다  당신을 위해 텍스트. 이런 식으로, 당신은 자신을 파싱하는 모든 논증을 쓰지 않아도되고 자체 문서화 CLI를 얻는다.

    조회 모듈

    와 이츠 위츠를 움직여  함수 외부에서 호출하십시오. require 만 가져 오기만하면됩니다.  조회 기능을 호출 할 때마다 한 번만 해당됩니다.

    와이즈 비즈 내부  기능, 당신은 aes 를 사용할 수 있습니다  동기식으로 비동기 작업을 작성합니다. async 를 사용할 때 , 비동기 작업의 해결 된 값을 동기 작업과 동일한 방식으로 변수에 할당 할 수 있습니다.

    와이즈 비즈 내부의 코드  본질적으로 필터 작업입니다. await 사용을 고려하십시오  대신 await 가정  배열 일뿐입니다.

    또한 중첩 된 삼항을 중첩 된 for-of 로 나누는 것이 좋습니다.  가독성에 대한 진술. 중첩되지 않고 계단식으로 배열되도록 조건을 정렬 할 수 있습니다.

    array.filter() 대신 빈 배열을 반환하는 것이 좋습니다  일치하는 항목이없는 경우 이런 식으로 소비 코드는 유형 검사를 처리 할 필요가 없습니다.

    해제 모듈

    와이즈 비즈  함수는 내 보낸 함수의 범위에있는 변수에 의존하지 않는 것 같습니다. 당신은 data 를 이동할 수 있습니다  해당 기능에서 벗어납니다.

    if  본질적으로 매핑 함수입니다 (한 배열의 값을 다른 배열의 값으로 변환). false 사용  대신

    decryptAll 부터  선택 속성을 새 개체에 매핑하는 것만으로, 구조화 및 속기 속성을 조합하여 단순화 할 수 있습니다.

    <시간>

    하단 코드는 다음과 같습니다.

    조회
    decryptAll
    
    
    해독
    for-of
    
    
    array.map()

  • 이전 javascript - 피아노, 모든 키를 출력하고 스케일을 제공
  • 다음 python - "미니언 게임"도전