【问题标题】:ExpressJS Await not working - SQL SELECT too fast (before INSERT)ExpressJS Await 不起作用 - SQL SELECT 太快(在 INSERT 之前)
【发布时间】:2022-02-14 00:29:27
【问题描述】:

我想做一个 SQL 插入,然后是一个带有完整列表的 Select,以在 Vue 中显示,包括新条目。但是 Select 比 Insert 快,并且只返回表中已经存在的旧值。我尝试使用 setTimeout 和 Async-Await。 (SQL 语句有效)

谁能帮帮我,我是 JS 新手。

async function select_time(datum, mitarbeiter_id){
    let returnQuery = 'SELECT ...'
    let retquery = mysql.format(returnQuery,[datum, mitarbeiter_id]);
    pool.query(retquery,(err, data) => {
        if(err) {
            console.error(err);
            return err
        }
 
        return data
    });
}

async function insert_time(datum, mitarbeiter_id, projekt_id, zeit_von, zeit_bis, stunden, taetigkeit){

    let selectQuery = 'INSERT INTO ...';    
    let query = mysql.format(selectQuery,[taetigkeit, projekt_id, mitarbeiter_id, zeit_von, zeit_bis, stunden, datum]);
    pool.query(query,(err) => {
        if(err) {
            console.error(err);
        }
    });
    if(taetigkeit == 15){
        let updateQuery = "UPDATE ..."
        let query2 = mysql.format(updateQuery, [mitarbeiter_id])
        pool.query(query2,(err, data) => {
        if(err) {
            console.error(err);
        }
        });        
    }
}

async function run_insert_time(datum, mitarbeiter_id, projekt_id, zeit_von, zeit_bis, stunden, taetigkeit){
    await insert_time(datum, mitarbeiter_id, projekt_id, zeit_von, zeit_bis, stunden, taetigkeit)
    const jsret = await select_time(datum, mitarbeiter_id)
    return jsret
}

app.get('/insertTime', (req, res) => {
    const datum = req.query.datum;
    const mitarbeiter_id = req.query.mitarbeiter_id;
    let projekt_id = req.query.projekt_id;
    let zeit_von = req.query.zeit_von;
    let zeit_bis = req.query.zeit_bis;
    const stunden = req.query.stunden;
    const taetigkeit = req.query.taetigkeit;

    const js = run_insert_time(datum, mitarbeiter_id, projekt_id, zeit_von, zeit_bis, stunden, taetigkeit)

    res.json(js)
 })

【问题讨论】:

    标签: javascript sql express async-await


    【解决方案1】:

    如果pool.query 没有类似的函数并支持 Promise,那么您需要将所有此类调用包装到 Promise 中,以便能够等待结果并在需要时将其返回到外部。

    async function select_time(datum, mitarbeiter_id){
        let returnQuery = 'SELECT ...'
        let retquery = mysql.format(returnQuery,[datum, mitarbeiter_id]);
        return new Promise((resolve, reject) => {
          pool.query(retquery,(err, data) => {
              if(err) {
                  console.error(err);
                  reject(err);
              }
     
              resolve(data);
          });
        });
    }
    

    查看answer,了解更多关于如何将带有回调的函数转换为类似 Promise 的函数的信息。

    【讨论】:

      【解决方案2】:

      扩展@anatoly 的非常好的答案:

      我发现内联 return new Promise... 在视觉上会破坏程序流程。通过创建一个单独的“承诺”版本,您的异步函数变得更加简洁。它只是重新排列代码,最终结果相同。

      const pQuery = qryText => new Promise((resolve, reject) => {
        pool.query(qryText, (err, data) => {
          if (err) reject(err);
          else resolve(data);
        });
      });
      

      然后你的async functions 变得很干净。例如:

      async function select_time(datum, mitarbeiter_id){
        let returnQuery = 'SELECT ...'
        let retquery = mysql.format(returnQuery,[datum, mitarbeiter_id]);
        const data = await pQuery(retquery);
        return data;
      }
      

      顺便说一句:node.js 有util.promisify,这使得它更容易实现。

      const { promisify } = require('util');
      const pQuery = promisify(pool.query.bind(pool));
      

      (很确定您需要bind,但您可以尝试不使用,看看它是否有效)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-10
        相关资源
        最近更新 更多