【问题标题】:How to make a function to query MySQL in NodeJS?如何在 NodeJS 中创建一个查询 MySQL 的函数?
【发布时间】:2020-07-30 09:34:49
【问题描述】:

我做了这个:

const mysql = require('mysql2/promise')

const pool = mysql.createPool({
    host: 'localhost',
    user: 'root',
    password: '',
    database: 'nodejs',
    waitForConnections: true,
    connectionLimit: 10,
    queueLimit: 0
})

async function query(query) {

    const result = await pool.query(query)
    return result[0]

}

console.log(query('SELECT * FROM `users`'))

我回来了

Promise { <pending> }

我如何从查询数据库中取回我的结果,就像 PHP 一样?
在 PHP 中,我从来不需要做像 async/await 和 promises 这样的事情...

我也试过用mysql:

const mysql = require('mysql')

const db = mysql.createConnection({
    host     : 'localhost',
    user     : 'root',
    password : '',
    database : 'nodejs'
})

function query(query) {
    db.query(query, (err, result) => {
        if (err) throw err
        return result
    })
}

console.log(query('SELECT * FROM `users`'))

但我得到了一个未定义的结果

【问题讨论】:

    标签: mysql node.js async-await node-mysql2


    【解决方案1】:

    我对 MySQL 和您使用的库不是很熟悉。

    但是,您收到的Promise { &lt;pending&gt; } 响应是因为您没有等待查询执行。

    由于该函数被标记为async 并且还在执行异步操作,因此它返回一个需要等待解决的 Promise。

    下面的代码应该可以工作:

    const mysql = require('mysql2/promise')
    
    const pool = mysql.createPool({
        host: 'localhost',
        user: 'root',
        password: '',
        database: 'nodejs',
        waitForConnections: true,
        connectionLimit: 10,
        queueLimit: 0
    })
    
    async function query(query) {
    
        const result = await pool.query(query)
        return result[0]
    
    }
    
    (async () => {
        const queryResult = await query('SELECT * FROM `users`');
        console.log(queryResult);
    } )();
    

    要了解 async-await 的工作原理,请考虑以下代码:

    console.log('I will get printed first');
    const asyncFunction = async () => {
       await setTimeout(()=> {}, 1000)
       console.log('I will get printed third');
       return 'hello'
    }
    
    (async () => {
      const result = await asyncFunction();
      console.log(`I will get printed last with result: ${result}`);
    })();
    
    console.log('I will get printed second');
    

    console.log 语句I will get printed last with result 将等待asyncFunction 完成执行后再执行。

    【讨论】:

    • const queryResult = await query('SELECT * FROM `users`') ^^^^^ SyntaxError: await is only valid in async function
    • 我已经更新了我的答案。添加的额外函数创建了一个虚拟异步函数,可帮助您运行 await 命令。
    • 最后一件事:如果我在调用异步函数之前添加console.log('Start'),在调用异步函数之后添加console.log('End'),代码输出Start End {queryResult}而不是Start {queryResult} End...
    • 没错。这就是 NodeJS 的非阻塞特性。简单来说,假设您正在烹饪三样东西,START、QUERY 和 END。您首先将 START 放在刻录机上,然后放入 QUERY,最后放入 end。 START先完成烹饪,然后上菜。 END 下一个结束,你也发球。但是,QUERY 会最后烹饪,因此您会最后上菜。 Node 在事件循环的帮助下处理这个问题。这里有一篇文章可以帮助你理解事件循环:https://www.tutorialspoint.com/nodejs/nodejs_event_loop.htm
    • 但是如果我无法解决这个问题,这个问题将帮助我做的就是将我的代码缩短 2 行,但缩进更多......如果可能的话,可以编辑以这样一种方式编码,即 END 在我烹饪 END 之前等待 QUERY 完成烹饪?
    【解决方案2】:

    试试这个:

    var mysql = require('mysql');
    
    var con = mysql.createConnection({
        host: "localhost",
        user: "yourusername",
        password: "yourpassword",
        database: "mydb"
    });
    
    // function definition
    function runQuery (con, sqlQuery) {
    
        return new Promise((resolve, reject) => {
            console.log("START");
            if(con){
                con.connect(function (err) {
                    if (err) throw err;
                });
    
                if (sqlQuery) {
                    con.query(sqlQuery, function (error, result, fields) {
                        connection.end(); // end connection
                        if (error) {
                            throw error;
                        } else {
                            return resolve(result);
                        }
                    });
                } else {
                    connection.end(); // end connection
                    // code:  handle the case 
                }
            } else {
                // code: handle the case
            }
    
        });
    
    }
    
    var sqlQuery = 'SELECT * FROM tableName';
    
    // function call and pass the connection and sql query you want to execute
    var p  = runQuery(con, sqlQuery); 
    p.then((data)=>{ // promise and callback function
        console.log('data :', data); // result
        console.log("END");
    
    });
    

    【讨论】:

    • 最后一部分:如果我在 runQuery 函数之后添加一个 console.log('Start') 和一个 console.log('End') 到代码的末尾,(这将调用函数runQuery),代码将输出Start End data: {resultData}。如何将{resultData} 放在StartEnd 之间?
    • 对于您在评论中的上述查询,我​​编辑了我的答案。检查一次。 @zS1L3NT
    【解决方案3】:

    试试这个:

    var mysql = require('mysql');
    
    var con = mysql.createConnection({
      host: "localhost",
      user: "yourusername",
      password: "yourpassword",
      database: "mydb"
    });
    
    con.connect(function(err) {
      if (err) throw err;
      con.query("SELECT * FROM customers", function (err, result, fields) {
        if (err) throw err;
        console.log(result);
      });
    });
    

    【讨论】:

    • 我想创建一个函数来查询数据库,如 query('SELECT * FROM users') 它将返回所有用户
    猜你喜欢
    • 2021-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-24
    • 1970-01-01
    • 1970-01-01
    • 2016-01-08
    • 1970-01-01
    相关资源
    最近更新 更多