함수 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
'programing' 카테고리의 다른 글
GitHub은 페이지를 다시 로드하지 않고 URL을 어떻게 변경합니까? (0) | 2023.08.08 |
---|---|
보기에서 호스팅 활동을 가져오는 방법은 무엇입니까? (0) | 2023.08.08 |
Powershell에서 인증된 웹 요청을 만드는 방법은 무엇입니까? (0) | 2023.08.08 |
CSS를 사용하여 여러 개의 배경 이미지를 가질 수 있습니까? (0) | 2023.08.08 |
jQuery의 사용자 지정 이벤트? (0) | 2023.08.08 |