2012-05-11 46 views
8

我正在尋找支持存儲過程的nodejs的mySQL驅動程序。 http://nodejsdb.org/db-mysql/,我一直在使用給出了錯誤是否有支持存儲過程的nodejs上的mysql驅動程序?

過程不能返回在給定上下文

+0

請顯示您的代碼。 – eggyal

+0

這裏是一個示例http://pastebin.com/8sh1vXrP – abinop

+1

你總是有更多的選擇,如果萬一你不能破解這個模塊,請檢查https://github.com/joyent/node/wiki/模塊#wiki-db-mysql – Futur

回答

4

它工作在nodejs-mysql-native

存儲過程的結果集:

DELIMITER // 
CREATE PROCEDURE test1p1() 
    BEGIN 
    SELECT 1+1; 
    END // 
DELIMITER ; 

的node.js腳本:

mysql = require('mysql-native'); 
var db = mysql.createTCPClient(); 
    db.auth('test', 'tester', ''); // db, user, password 

db.query('call test.test1p1;').on('row', function(r) { 
    console.log(r); 
}).on('end', function() { 
    console.log('OK!'); 
}); 

輸出:

{ '1+1': 2 } 
OK! 
11

菲利克斯Geisendörfer的node-mysql支持存儲過程,但你需要通過SELECT結束存儲過程荷蘭國際集團成功/失敗的標誌,然後查詢它你將一個SELECT查詢。這裏的存儲過程可能如下:

DELIMITER // 
DROP PROCEDURE IF EXISTS MyProcedure // 
CREATE PROCEDURE MyProcedure(IN param1 VARCHAR/*, My, Parameters, ... */) 
BEGIN 

    DECLARE EXIT HANDLER FOR NOT FOUND, SQLWARNING, SQLEXCEPTION SELECT 0 AS res; 
    # My Queries etc. ... 

    SELECT 1 AS res; 

END // 
DELIMITER ; 

您的節點的代碼看起來是這樣的:用存儲過程和它的很簡單隻需要調用你的存儲與參數的過程

var mysql = require('mysql'); 

var client = mysql.createConnection({ 
    host : '127.0.0.1', 
    user : 'username', 
    password: 'password' 
}); 
client.query('USE mydatabase'); 

var myParams = "'param1', 'param2', ... "; 
client.query("CALL MyProcedure(" + myParams + ")", function(err, results, fields) { 
    if (err || results[0].res === 0) { 
     throw new Error("My Error ... "); 
    } else { 
     // My Callback Stuff ... 

    } 
}); 
+1

你必須開玩笑這個字符串連接的參數值。你想SQL注入?這是我們如何獲得SQL注入。 – moron4hire

+1

或許這個例子應該被更新以顯示如何正確地逃脫,例如https://www.npmjs.com/package/mysql#escaping-query-values – kurttheviking

+1

您可以簡單地通過使用+ client.escape(myParams)+ – user3564573

3

node-mysql司機的工作。

CREATE PROCEDURE GetAllStudent(id int) 
BEGIN 
SELECT * FROM student where userid = id ; 
END; 

和節點只需要調用

app.get('/sp', function (req, res, next) { 
    connection.connect(); 
    connection.query('CALL GetAllStudent(?)',[req.body.id],function (err, rows, fields) { 
     if (err) { 
      res.status(400).send(err); 
     } 
     res.status(200).send(rows); 
    }); 

    connection.end(); 
}); 

這種方式無需擔心SQL注入。

here是良好的NodeJS教程和MySQL

0

把多種解決方案一起完整

存儲過程:

CREATE PROCEDURE GetStudent(id int) 
BEGIN 
SELECT * FROM student where userid = id ; 
END; 

的Node.js和快速代碼:

var express = require('express'); 
var mysql = require("mysql"); 
var 

app = express(); 

var pool = mysql.createPool({ 
    connectionLimit: 100, 
    host: 'localhost', 
    user: 'root', 
    password: '', 
    database: 'demo' 
}); 

app.get('/pool', function (req, res) { 

    var studentId = req.body.id; 

    pool.getConnection(function (err, connection) { 
     // connected! (unless `err` is set) 
     if (err) { 
      res.status(400).send(err); 
     } 
     connection.query('CALL GetStudent(?)',[studentId], function (err, rows, fields) { 
      connection.release(); 
      if (err) { 
       res.status(400).send(err); 
      } 
      res.status(200).send(rows); 
     });  
    }); 
}); 

app.listen(4000, function() { 
    console.log('Server is running.. on Port 4000'); 
}); 

(來源:Pushker Yadav和「http://www.javascriptpoint.com/nodejs-mysql-tutorial-example/「)

相關問題