2017-10-14 28 views
0

這可能是一個愚蠢的問題,但我無法找到答案。 我的數據庫查詢(節點 - > PostgreSQL的)不點火時,查詢功能本身是從另外一個回調像這樣調用回調:節點 - 數據庫查詢回調未觸發

routes.js

router.post("/getsheet/", (req, res) => { 

    googleAPI.getSheet(googleToken, req.body.sheetid).then((invoices) => { 

     templateData.sheetData = invoices; 
     templateData.sheetData.length = invoices.length; 

     // When sheet is received, db query runs but it's callback won't 
     // function takes an array and index 
     db.query(invoices, 1).then((db_results) => { 
      console.log(db_results); 
      res.redirect("/"); 
     }).catch((db_error) => { 
      console.error(db_error) 
      res.redirect("/"); 
     }); 

    }).catch((error) => { 
     console.error(error); 
    }); 
}); 

db.js

const query = (data, index) => { 
return new Promise((resolve, reject) => { 
    // console log fires but not the callback function so it does not resolve or reject 
    console.log("... querying index ... " + index + " customer: " + data[index].name); 
    client.query(`SELECT * FROM customer WHERE customer_number=${data[index].customer_id};`, (err, res) => { 
      // does not run this block 
      if (!err) { 
       resolve(res); 
      } else { 
       return reject(err); 
      } 
    }); 
}); 

}

謝謝! :)

+0

你在'routes.js'代碼甚至不叫'你看後query'功能。缺了點什麼。一般來說,不是將'pg'庫轉換爲承諾,而是使用[pg-promise](https://github.com/vitaly-t/pg-promise);} –

+0

這些片段是更大代碼和routes.js當然需要變量「db」中的db.js。客戶端連接和結束在查詢功能之前和之後。 對不起,我留下了這些問題。 – Mulperi

回答

1

你已經建立了連接?在嘗試運行查詢之前,您需要先執行該操作。這裏看一個例子: http://mherman.org/blog/2015/02/12/postgresql-and-nodejs/#.WeJpJWhSyUk

pg.connect(connectionString, (err, client, done) => { 
    // Handle connection errors 
    if(err) { 
     done(); 
     console.log(err); 
     return res.status(500).json({success: false, data: err}); 
    } 
    // SQL Query > Select Data 
    const query = client.query('SELECT * FROM items ORDER BY id ASC;'); 
    // Stream results back one row at a time 
    query.on('row', (row) => { 
     results.push(row); 
    }); 
    // After all data is returned, close connection and return results 
    query.on('end',() => { 
     done(); 
     return res.json(results); 
    }); 
    }); 

另外,我會強烈建議您使用npm pg-promise。將簡化你的生活。

最後,你也錯過了諾言的重點。我鼓勵你使用新的異步/等待。但是,如果你不想和/或不能,至少可以看到爲什麼你只是回到了回撥地獄......諾言是有助於減少所有回調嵌套。真的是你應該減少你的承諾巢水平,像這樣:

router.post("/getsheet/", (req, res) => { 

    googleAPI.getSheet(googleToken, req.body.sheetid).then((invoices) => { 

     templateData.sheetData = invoices; 
     templateData.sheetData.length = invoices.length; 

     // When sheet is received, db query runs but it's callback won't 
     // function takes an array and index 
     return db.query(invoices, 1); 
    }).then((db_results) => { 
     console.log(db_results); 
     res.redirect("/"); 
    }).catch((error) => { 
     console.error(error); 
     res.redirect("/"); 
    }); 
}); 
+0

是的,數據庫查詢的工作原理和連接建立在查詢函數之前。謝謝,我會嘗試你的建議,並讓你知道它是怎麼回事! :) – Mulperi

+0

我將此標記爲答案,因爲您指出我正確的方向。謝謝! :) 順便說一句:我結束了使用基本的pg模塊,因爲它可以做出「承諾 - 查詢」它也是這樣的: 'client.query(query).then((data)=> {... })。catch((e)=> {...}) – Mulperi

+0

@Mulperi'pg-promise'不僅僅是承諾:https://github.com/vitaly-t/pg-promise#about –