2012-05-11 79 views
8

Estoy buscando un controlador mySQL para nodejs que admita procedimientos almacenados. http://nodejsdb.org/db-mysql/ que he estado usando da el error¿Hay un controlador para mysql en nodejs que admita procedimientos almacenados?

procedimiento no puede devolver un conjunto de resultados en el contexto dado

+0

Por favor, muestre su código. – eggyal

+0

aquí hay un ejemplo http://pastebin.com/8sh1vXrP – abinop

+1

Usted siempre tiene pocas opciones más, si en caso de que no pueda descifrar este módulo, consulte https://github.com/joyent/node/wiki/ modules # wiki-db-mysql – Futur

Respuesta

4

funciona en nodejs-mysql-native

procedimiento almacenado:

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

Node.js secuencia de comandos:

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!'); 
}); 

resultado: node-mysql soportes de

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

Felix Geisendörfer procedimientos almacenados, pero hay que poner fin a su procedimiento almacenado por SELECT ing una bandera de éxito/fracaso, entonces se le pregunta como lo haría una consulta SELECT. Así es como podría ser el procedimiento almacenado:

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 ; 

Su código Nodo sería algo como esto: el trabajo

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

Tienes que estar bromeando con esta cadena de concatenación de valores de parámetros. ¿Quieres inyección de SQL? Así es como obtenemos SQL Injection. – moron4hire

+1

quizás el ejemplo se deba actualizar para mostrar cómo escaparse correctamente, p. https://www.npmjs.com/package/mysql#escaping-query-values ​​ – kurttheviking

+1

Puedes simplemente escapar usando + client.escape (myParams) + – user3564573

3

node-mysql conductor con procedimiento almacenado y su muy simple simplemente llame a su procedimiento almacenado con parámetros.

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

y en el nodo a llamarlo

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(); 
}); 

esta manera hay necesidad de preocuparse de inyección SQL.

here es buen tutorial sobre nodejs y mysql

0

Poner múltiples soluciones en conjunto para la integridad

procedimiento almacenado:

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

Node.js y código 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'); 
}); 

(Fuente de créditos: Pushker Yadav y "http://www.javascriptpoint.com/nodejs-mysql-tutorial-example/ ")

Cuestiones relacionadas