Node.js에서 약속 및 async-await를 사용하여 연결된 MariaDB 쿼리

12002 단어 beginnerswebdevnode

소개



로그인한 사용자의 닉네임 및 등록된 친구 목록과 같은 사용자 정보를 표시하는 대시보드가 ​​있는 React.js에서 웹 애플리케이션을 구축한다고 상상해 보십시오. 이 정보는 MariaDB 데이터베이스의 두 테이블(사용자 및 친구)에 저장됩니다.

일반적인 문제



Node.js의 초보자로서 데이터 검색을 위한 axios.get() 요청이 이전 쿼리의 출력에 의존하는 여러 개의 연결된 쿼리를 실행해야 하는 문제를 우연히 발견할 수 있습니다.


숙련된 개발자의 경우 Node.js 코드가 한 번에 하나의 작업을 실행할 수 있는 이벤트 루프를 사용하여 단일 스레드 아키텍처에서 실행된다는 것은 잘 알려져 있습니다. 코드 차단 문제를 방지하기 위해 실행 스레드는 다음 코드 조각으로 이동하기 전에 작업이 완료될 때까지 기다리지 않습니다. 노드 버전 7.6 이전에는 콜백이 연속 작업을 실행하는 유일한 방법이었습니다. 콜백은 작업을 완료하기 위해 외부 함수를 호출할 수 있는 다른 함수 내부의 인수로 전달되는 함수입니다. 중첩된 콜백 체인을 사용하면 지저분해질 뿐만 아니라 후속 작업에 문제를 쉽게 일으킬 수 있습니다.

일반적으로 호출되는Callback hell 방법을 찾기 위해 async-await 개념이 도입되었습니다. async 키워드가 있는 함수는 반환된 개체가 약속임을 보장합니다. await 키워드는 대기 중인 약속이 해결될 때까지 코드 실행을 일시 중단합니다. 이제 비동기 함수의 가능성을 이해할 수 있지만 그 구현에 대해 머리를 감싸는 것은 여전히 ​​당혹스러울 수 있습니다.

내 대시보드 데이터를 어떻게 검색했습니까?



백엔드 서버는 Node.js/Express 프레임워크를 사용하여 포트 3001에 설정되었습니다. 앞에서 언급했듯이 axios.get() 메서드는 사용자의 이메일 주소를 URL 매개변수로 전달하여 백엔드 서버에 HTTP 요청을 만드는 데 사용되었습니다.

const getDashboardInfo = () => {
axios.get("http://localhost:3001/dashboard", {
            params: {
                user: user_email,
            }
      })
      .then(response => {
            setFriendList(response.data.friendList);
            setUserNickname(response.data.user[0].nickname);
      })
};


세 가지 약속이 있는 비동기 함수는 i) 정보를 얻는 데 사용되었습니다. 테이블 users에서 로그인한 사용자의 ID, ii) friends 테이블에서 로그인한 사용자의 모든 친구 ID를 가져오고, iii) 모든 친구의 정보를 얻습니다. 사용자 테이블의 이름. 사용자 데이터와 사용자 닉네임이 포함된 친구 목록이 Frontend에 대한 응답으로 전달되었습니다. 사용자에게 (아직) 친구가 없으면 값이 false인 부울 개체가 전달되었습니다.

const getDashboardData = (req, res) => {
const queryObject = url.parse(req.url, true).query;
(async () => {
        // Call 1st function to get information for logged in user
        const user = await getUser(queryObject.user);

        // Call 2nd function to get user’s friends id
        const friendIdList = await getFriendsId(user[0].id);

        // Formatting friendIdList-array
        let formattedIdList = [];
        friendIdList.forEach((item, index) => {
            formattedIdList = [...formattedIdList, item.friend_id]
        });

        if (formattedIdList.length > 0) {
            // Call 3rd function to get data of user’s friends
                    const friendList = await getFriendsList(formattedIdList);
                    res.send({friendList: friendList, user: user});
        } else {
                    res.send({friendList: false, user: user});
        }
})()
};


약속은 보류, 이행 또는 거부의 세 가지 상태 중 하나를 취할 수 있습니다. resolve 또는 reject 메서드가 호출될 때까지 초기 상태는 보류 중입니다. 오류가 발생하면 거부된 약속이 발생한 오류와 함께 반환됩니다. 약속이 해결되면 상태가 이행되고 확인된 값은 await 표현식의 반환 값으로 처리됩니다.

// 1st function to query information for logged in user 
const getUser = (user) => {
return new Promise((resolve, reject) => {
            dbConnection.query('SELECT * FROM users WHERE email = ?', user,
            (err, result) => {
                    return err ? reject(err) : resolve(result)
            })
})
};

// 2nd function to query user’s friends id
const getFriendsId = (id) => {
return new Promise((resolve, reject) => {
            dbConnection.query('SELECT * FROM friends WHERE user_id = (?)',[id],
            (err, result) => {
                    return err ? reject(err) : resolve(result)
            })
})
};

// 3rd function to query data of user’s friends
const getFriendsList = (idList) => {
return new Promise((resolve, reject) => {
            dbConnection.query('SELECT * FROM users WHERE id IN (?)', [idList],
            (err, result) => {
                    return err ? reject(err) : resolve(result)
            })
})
};


위의 솔루션이 저에게 효과적이었습니다. 어떻게 해결하시겠습니까?

좋은 웹페이지 즐겨찾기