2012-05-11 19 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/“)

相关问题