약속, 노드, 지루함, Azure SQL.맙소사!

9887 단어 azuresqlnodebeginners
Node의 초보라면나와 마찬가지로 Tedious를 사용하여Azure SQL에 접근하는 것은 처음에는 도전적일 수 있다.나의 이해는 비록 완전히 다른 것이지만, 그것은norPromises나 더 현대적인async/await pattern을 지지하지 않는다는 것이다.사실상 지루한 코드는 events를 사용하여 비동기 코드를 실행하기 때문에 약속과 호환될 수 있는 작업을 해야 한다.
하루가 끝날 때 몇 줄의 코드만 필요하지만, 이 두 줄의 코드를 발견하는 과정은 상당히 길고, 때로는 사람을 낙담하게 할 수도 있다.어느 곳에서도 이 점을 어떻게 정확하게 하는지 명확한 성명이 없다.나는 이것이 네가 약속을 장악하면 아주 뚜렷해지기 때문이라고 생각한다...만약 네가 아직 이 점에 도달하지 못했다면, 너는 어둠 속에 남았을 것이다.
그렇다면 공유지식서의 빈틈, 즉 인터넷을 복구해 보자!

무미건조한 용법을 개괄하다
같은 코드를 반복해서 작성하는 것을 피하기 위해서, SQL 명령을 실행하는 업무 논리를 함수에 봉인하기를 원할 수도 있습니다.이론적으로 말하면, 아래와 같다.
executeSQL = function(query, params) {
  var result = null;

  const conn = new Connection(...);
  conn.on('connect', err => { ... invoke req ... });

  const req = new Request(query, err => { return result });
  req.addParameter(...params...);
  req.on('rows', columns => { ... build result ... });

  conn.connect();  
}
connect() 방법을 성공적으로 호출하면 연결 이벤트가 발생합니다.그곳에서 창설을 실행할 수 있습니다 Request.요청은 Azure SQL에서 결과를 가져오고 이를 처리하여 선택한 변수에 저장할 수 있는 row 이벤트를 생성합니다.
현재의 도전은 어떻게 결과 집합을 가진 변수를 호출자에게 되돌려 줍니까?
뭐라고 쓰세요.
queryResult = executeSQL(...)
executeSQL 함수의 내용이 비동기적으로 실행되기 때문에, 작업이 이루어지지 않습니다.이것은 함수체에 return result;를 추가하더라도 함수가 끝날 때까지 유일하게 queryResult 변수에 저장될 수 있다는 것을 의미한다.아무것도 아니에요.만약 사실이라면 return 문장은 실질적으로 리셋을 실행하지만, 이때 result 변수는 비어 있을 것이다. 왜냐하면 Azure SQL이 이렇게 빨리 결과를 되돌릴 수 없기 때문이다.Azure SQL은 밀리초 이내에 데이터를 쉽게 반환할 수 있지만, 이 경우 네트워크 왕복 시간은 이뿐만이 아닙니다.
그래서 우리가 해야 할 일은 변수result가 사용할 때만 변수와 그 내용을 사용할 수 있도록 확보하는 것이다.
이것이 바로 약속의 작용이다."약속은 일반적으로 최종 사용 가능한 가치의 에이전트로 정의됩니다."

약속 패키지 만들기
이 점을 감안하면, 우리는 고전 함수가 아닌 재사용 가능한 방법을 약속으로 포장해야 한다는 것이 분명하다.코드는 다음과 같습니다.
const executeSQL = (query, params) => new Promise(
  (resolve, reject) => { 

  ...function body...
}
이것은 매우 간단하다, 그렇지?우리는 지금 두 개의 리콜을 방문할 수 있다
  • resolve: 모든 것이 예상대로 진행되고 결과가 호출자가 처리할 때 어떤 일을 할 준비가 되어 있음
  • reject: 어떤 물건이 작용하지 않고 결과가 사용할 수 없을 때.
  • Request 객체가 Azure SQL에서 결과 세트를 완전히 전송한 후 일부 코드를 실행할 수 있도록 리셋을 지원한다는 점을 감안하면 원본 코드는 다음과 같습니다.
    const req = new Request(query, (err) => {
            if (err) {
                reject(err);
            } else {
                resolve(result);
            }       
        });    
    
    우리는 result 변수를 안전하게 사용할 수 있다는 것을 알고 있다. 이 변수는 row 이벤트 처리 프로그램에 채워져 있다. 예를 들어 Tedious doc assure us "요청이 완료되었을 때 리셋을 호출할 수 있다. 성공하든 오류가 있든. 문장이 실행되는 동안 오류가 발생하면err는 오류를 설명할 것이다."

    약속을 이행해라, 루크!
    기왕 우리가 승낙한 바에야 그것을 쓰자.
    코드의 어느 곳에서, 우리는 executeSQL 함수를 호출하고, 결과를 우리가 선택한 변수에 넣기를 희망합니다.이런 걸 쓰는 게 아니라,
    const result = executeSQL(query, params);
    
    우리는 이렇게 해야 한다.
    executeSQL(query, params)
      .then(ok => {
         ...process result here...
            })
      .catch(err => {
         ...handle errors here...
            });
    
    then 코드 블록에서 ok 변수의 결과를 사용할 수 있습니다.
    됐어, 완성했어!이제 모든 것이 순조롭게 진행될 것이다.

    결론
    나는 정말 이 문장이 이 도전을 영원히 명확하게 해결하는 데 도움이 되기를 바란다.나는 바로 이런 문장이 내 생활에서 많은 시간을 절약할 수 있기를 매우 바란다.이제 나는 약속에 대해 잘 이해했다. 그리고, 그렇다. 지금은 모든 것이 자질구레하지만, 이 점에 도달하는 것은 고통스러운 여정이다.코딩은 고통이 아니라 즐거움이어야 한다!낙담하는 것도 괜찮고, 때로는 도움이 되지만, 나는 이것이 너무 심하다고 생각한다.자, 이제 형세가 바뀌었습니다. 이 글은 게임에 즐거움을 주기 위해서입니다!
    다음까지 즐겁게 놀아요.

    기다리다소스 코드를 원합니다!
    물론, 원본 코드!여기는: Todo Backend Implementation with Azure Functions, Node and Azure SQL, 더 구체적으로 말하면 본고에서 기술한 코드는here이다.
    연습으로 저는 Todo MVC app규범에 따라 Todo Backend API완전한 작업의 백엔드 API를 실현했습니다.나는 모든 것이 레고 블록처럼 완벽하게 결합된 것을 좋아한다.
    사진 작성자Castorly Stock 출처Pexels

    좋은 웹페이지 즐겨찾기