在nodejs上是否有支持存储过程的mysql驱动程序?

abi*_*nop 10 mysql stored-procedures node.js

我正在寻找支持存储过程的nodejs的mySQL驱动程序.我一直在使用的http://nodejsdb.org/db-mysql/给出了错误

PROCEDURE无法在给定的上下文中返回结果集

小智 12

FelixGeisendö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 ;
Run Code Online (Sandbox Code Playgroud)

您的节点代码看起来像这样:

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 ...

    }
});
Run Code Online (Sandbox Code Playgroud)

  • 你一定是在开玩笑这个参数值的字符串连接。你想要 SQL 注入吗?这就是我们如何获得 SQL 注入。 (4认同)

Pus*_*dav 5

node-mysql驱动程序可用于存储过程,它非常简单,只需使用参数调用存储过程即可。

CREATE PROCEDURE GetAllStudent(id int)
BEGIN
SELECT * FROM student where userid = id ;
END;
Run Code Online (Sandbox Code Playgroud)

然后在节点中调用

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();
});
Run Code Online (Sandbox Code Playgroud)

这种方式无需担心sql注入。

是关于nodejs和mysql的很好的教程


And*_*rov 4

它适用于nodejs-mysql-native

存储过程:

DELIMITER //
CREATE PROCEDURE test1p1()
  BEGIN
  SELECT 1+1;
  END //
DELIMITER ;
Run Code Online (Sandbox Code Playgroud)

节点.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!');
});
Run Code Online (Sandbox Code Playgroud)

输出:

{ '1+1': 2 }
OK!
Run Code Online (Sandbox Code Playgroud)