programing

함수 nodejs의 mariadb에서 반환 값

javamemo 2023. 8. 8. 19:57
반응형

함수 nodejs의 mariadb에서 반환 값

내 코드야.

const mariadb = require('mariadb');
var test = async function(){
  var ret = "";
  await mariadb.createConnection({
        host: "localhost",
        user: "dave",
        connectionLimit: 5,
        password: "!@#",
        database: "db",
        rowsAsArray: false
  }).then((data)=>{
    ret = "test";
  });
  return ret;
}

console.log(test());

그럼 wait를 이용해서 어떻게 반품을 받을 수 있나요?

많은 경우에 비슷한 문제가 제기된 것으로 알고 있지만, mariadb를 사용한 문제는 찾을 수 없었습니다.

이미 저는 몇 가지 함정을 볼 수 있습니다. 초보자인 여러분은 이 코드에서 발견하게 될 것입니다.

  • avait결과가 반환되기를 기다리고 있습니다. 그는 받을 것이기 때문입니다.Promisses그것을 해결하기 위해
  • then비동기식으로 약속을 해결
  • 로 정의된 기능async항상 약속을 반환합니다.

기쁨의 순간을 보낸 후, '비동기화/기다림'을 이제 저는 그를 피하려고 합니다.주로 내가 비동기 함수를 사용하는 모든 함수는 당신이 사용할 때까지 비동기식이어야 하기 때문입니다.then예: 소규모 테스트:

  let test = async function() {
    let x = await 11
    return 1;
  }
  console.log(test()) //returns: Promise { <pending> }

거기에는 비동기적인 것은 없지만, 추가하는 것은async / await혼란을 일으켰습니다.

이제 코드를 수정

const mariadb = require('mariadb');
// use local scope `let` instead global `var`
let test = async function(){
  let conn = await mariadb.createConnection({
        host: "localhost",
        user: "dave",
        connectionLimit: 5,
        password: "!@#",
        database: "db",
        rowsAsArray: false
  });
  return conn.query("SELECT 1 as val") // no sense using `avait` because `test()` returns `promise`
}

test().then(function(rows) { console.log(rows)});

그리고 snc 없이.then약속을 되돌릴 수 있고 다음에 해결할 수 있습니다.then


mariadb.createConnection(...).then(conn => { // create connection
    return conn.query("SELECT 1 as val") // make query
}).then(rows => { //get result
    console.log(rows)
}).catch(err => console.error(err)) // get errors

그런데: 쿼리 작성기에 관심을 가져보세요. 예를 들어 knex.js.데이터베이스 엔진과 독립적으로 코드를 쓸 수 있습니다.

갱신하다

노드가 이벤트를 기반으로 한다는 사실부터 시작하겠습니다.

데이터베이스에서 데이터를 수신하는 예를 들어 보겠습니다.PHP / C++에서는 쿼리를 만들고, 기다리고, 결과를 받습니다.그리고 이 행동은 다음과 같이 시뮬레이션됩니다.await(Wait는 버전 8 근처 어딘가에 나타남)

일반적으로 노드의 코드는 사용자가 쿼리를 실행하도록 작동하며 노드는 새 스레드를 만듭니다.오래된 실행 다음 지침에서 새 결과를 얻을 수 있습니다. (좋아요, 거짓말이지만 설명하기가 더 쉬워요.)

그래서 당신은 데이터를 받는 이벤트를 처리해야 합니다.그리고 더 구체적으로 말하면,promise데이터를 제공합니다.await,.then ()또는callback (hell)

첫 번째 코드 설명:

당신은 리턴을 시도합니다.ret하지만 이 코드는 처음에 만들어집니다.return ret그리고 과제를 한 후에.

await데이터를 "인식"하므로, 사용해야 합니다.let var_name = await asyncFunction()

제 생각엔 당신은 이것을 원할 것입니다.

let getSomeDataFromDB = function(){
  return mariadb.createConnection([skip]).then(conn => {
    return conn.query("SELECT 1 as val") 
  })
}
let rows = await getSomeDataFromDB()

이 함수에서는 약속을 반환하는 사용자가 약속을 반환합니다.그리고 옆에서await이 약속 체인이 해결되었습니다.

하지만 여기 코드에 "작은" 오류가 있습니다.연결 중이고 어디에서도 연결을 종료하지 않기 때문입니다.따라서 글로벌 연결 개체를 사용하거나 다음과 같은 개체를 사용하는 것이 좋습니다.


let getSomeDataFromDB = function(){
  return new Promise(function(resolve, reject){
    mariadb.createConnection([skip]).then(conn => {
      conn.query("SELECT 1 as val")
        .then(rows=>resolve(rows))
        .catch(e=>reject(e))
        .then(()=>conn.close())
    }).catch(e => reject(e))
  })
}
let rows = await getSomeDataFromDB()

그리고 여기서 또 다른 중요한 것을 발견하게 됩니다.resolve코드 실행을 중단하지 않습니다.데이터가 사용자에게 반환되더라도 여전히 무언가를 할 수 있습니다.

또는마로지가찬▁와 같은 것.await

let getSomeDataFromDB = async function(){
  let conn = await reateConnection([skip])
  let rows = await conn.query("SELECT 1 as val")
  await conn.close();
  return rows;
}
let rows = await getSomeDataFromDB()

언급URL : https://stackoverflow.com/questions/54964303/return-value-from-mariadb-in-function-nodejs

반응형