nodejs上有支持存储过程的mysql驱动吗?
我正在寻找支持存储过程的nodejs的mySQL驱动程序。 http://nodejsdb.org/db-mysql/ ,我一直在使用给出的错误
PROCEDURE不能返回给定上下文中的结果集
它在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!
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 ;
你的节点代码看起来像这样:
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 ... } });
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注入了。
这里是关于nodejs和mysql的很好的教程
把多个解决scheme放在一起以保证完整性
存储过程:
CREATE PROCEDURE GetStudent(id int) BEGIN SELECT * FROM student where userid = id ; END;
Node.js和Express代码:
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/ ”)