2017-09-18 101 views
0

我想寫一個函數,讓我插入一個值到firebird數據庫中。查詢效果很好,只有我沒有回覆告訴我插入順利。Node.js Firebird SQL連接器 - 從INSERT返回結果...返回

這是我第一次使用firebird連接器。在過去,當使用mySql連接器時,我可以記得在插入新值時有某種回調。現在我使用的節點火鳥庫由Henri Gourvest來實現: https://github.com/hgourvest/node-firebird/

我嘗試添加在最後的返FEATURE_ID',但一個錯誤「遊標未打開」被拋出。功能ID由觸發器生成。

任何建議將是非常客氣。

pool.get(function(error, db) { 
    if (error) { 
     console.log(error) 
     res.status(403) 
     res.send() 

    } 
    else { 
     var date = moment(req.body.date, "DD/MM/YYYY") 
     var values = " VALUES ('" + date.format("MM/DD/YYYY") + "','Requested','" + req.body.type + "','" + req.body.description + "','" + req.body.memo +"')" 
     var query = 'INSERT INTO "Features" (FEATURE_REQUESTDATE, FEATURE_STATUS, FEATURE_TYPE, FEATURE_DESCRIPTION, FEATURE_MEMO)' + values 


     db.query(query , function(err, result) { 
      if (result) { //why is there no result here? 
       res.status(200) 
       res.send('ok') 
      } 
      if (err) { 
       console.log(err) 
       res.status(403) 
       res.send('error') 
      } 
     }) 


      db.detach(); 
     } 
}) 
+2

我希望您知道您的代碼易受SQL注入攻擊。使用參數而不是將值連接到查詢字符串中。 –

+0

謝謝Mark,我會確保將來使用參數。 – Eugenius

回答

2

我嘗試添加在最後的返FEATURE_ID',但一個錯誤「遊標未打開」被拋出。

當然,不能有遊標。光標(AKA行集)僅由查詢創建 - SELECT-類型的SQL語句。

如火鳥文檔中所述,與RETURNING條款聲明查詢類型的不是,他們是過程調用類型。您應該像處理常規的DELETE類型語句一樣執行它們,然後讀取所執行語句的PARAMETERS。

現在我使用的節點火鳥庫由Henri Gourvest來實現:https://github.com/hgourvest/node-firebird/
任何意見將是很親切。

有兩個建議。

  1. NEVER做拼接你數據值到SQL 命令文本。它使你的程序非常脆弱。它會給你所有類型的數據轉換錯誤,並且它會打開高速公路,以防止意外的錯誤或惡意用戶輸入造成的數據庫損壞。請參閱http://bobby-tables.com/http://en.wikipedia.org/wiki/SQL_injection

  2. 「使用源盧克」。你提到的庫是開源的。所以你必須檢查那個庫中的例子。亨利被稱爲非常簡潔的文件。然而,他爲他的不同圖書館提供了大量的例子和/或測試。兩者都適合你,因爲他們確實使用庫,所以你可以閱讀庫的創建者是如何使用它的。這個特定的庫有測試。測試總是用例的例子。

因此,你進入test文件夾,你會看到有run.js文件。打開它。

現在按Ctrl + F,然後搜索 「迴歸」 二字。並不總是第一次,但其中一次出現應該完全測試您需要的SQL功能。

這是它在您機器上已有的庫文本中的第一次出現。當然,第一次出現會增加使用BLOB的複雜性,而這些BLOB並不需要馬上關閉。所以我會引用您下載的庫中的THIRD示例。但即使是第一個示例,也向您展示瞭如何正確執行帶有值和RETURNING子句的查詢。

function test_insert(next) { 

....skip....... 

    // Insert record without blob 
     database.query('INSERT INTO test (ID, NAME, CREATED, PARENT) VALUES(?, ?, ?, ?) RETURNING ID', [3, 'Firebird 3', now, 862304020112911], function(err, r) { 
      assert.ok(!err, name + ': insert without blob (buffer) (1) ' + err); 
      assert.ok(r['id'] === 3, name + ': without blob (buffer) returning value'); 
      next(); 
     }); 

    // Insert record without blob (without returning value) 
     database.query('INSERT INTO test (ID, NAME, CREATED) VALUES(?, ?, ?)', [4, 'Firebird 4', '2014-12-12 13:59'], function(err, r) { 
      assert.ok(!err, name + ': insert without blob (buffer) (2) ' + err); 
      assert.ok(err === undefined, name + ': insert without blob + without returning value'); 
      next(); 
     }); 
+1

感謝您的建議。你教會了我一個寶貴的教訓! – Eugenius