11

ストアドプロシージャをサポートするnodejs用のmySQLドライバーを探しています。私が使用しているhttp://nodejsdb.org/db-mysql/はエラーを出します

PROCEDUREは、指定されたコンテキストで結果セットを返すことができません

4

5 に答える 5

13

FelixGeisendörferのノード-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 ...

    }
});
于 2012-05-21T14:29:05.773 に答える
6

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に関する良いチュートリアルがあります

于 2016-11-21T03:54:42.973 に答える
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!
于 2012-05-11T11:08:42.830 に答える
1

これは回答済みですが、私は自分のバージョンで貢献します。それがあなたやこの投稿に出くわした他の人の助けになることを願っています

あなたの場合、これは私が単一のファイルで、あなたが達成しようとしていることを(2019年の方法で、ちょっと...)行う方法です(エクスプレスフレームワークとほとんどすべての人がデフォルトのmysqlパッケージ以外のものは必要ありません使用)

まず、次の2つのパッケージをインストールします。

次に、次のようなストアドプロシージャを作成します。

DELIMITER //
DROP PROCEDURE IF EXISTS myProcedure //
CREATE PROCEDURE myProcedure()
  BEGIN
    SELECT 'hello from procedure' AS message;
  END //
DELIMITER ;

最後に、ノードjsスクリプトを作成して開き、次のコード行を記述します。

//handles the requests/responses in your API
const express = require('express');

//handles the mysql stuff 
const mysql = require('mysql');


const app = express(); //create your express based app

//database access config
const config = {
  host: '127.0.0.1',
  user: 'username',
  password: 'password'
  database: 'test-db'
}

//Example route(you can add more of these for POST, PATCH and so on)
//If you need other methods just change the 'app.get' to 'app.<method here>'.
app.get('/test-route', (req, res) => { 
  try
  {
    const dbConn = mysql.createConnection(config); //creates a connection with the config above
    dbConn.connect((err) => { //connect to the db
      if(err)//if the connection fails log and send a error response
      {
        console.log(`Error: ${err.stack}`);
        res.status(500).send({error: "Something went wrong."});
      }
      else
      {
        let stmt = `CALL myProcedure();`; //sql query for running the example procedure 

        //You don't need to wrap anything in a try catch block if you don't mind 
        //your app crashing if any mysql related errors occur.
        //Console.log isn't required either. 
        //Use these above only if you need.
        try 
        {
          dbConn.query(stmt, (err, rows) => {
            if(err)//if the query fails log and send a error response
            {
              console.log(`Error: ${err.stack}`);
              res.status(500).send({error: "Something went wrong."});
            }
            else
            {
              try
              {
                //closes the connection and sends the result of executing the procedure
                dbConn.end();
                res.send({message: rows[0][0].message});
              }
              catch(err)
              {
                console.log(`Error: ${err.stack}`);
                res.status(500).send({error: "Something went wrong."});
              }
            }
          });
        }
        catch(err) 
        {
          console.log(`Error: ${err.stack}`);
          res.status(500).send({error: "Something went wrong."});
        }
      }
    });
  }
  catch(err)
  {
    console.log(`Error: ${err.stack}`);
    res.status(500).send({error: "Something went wrong."});
  }
}

//this must always be your last line of code in order
//for you to be able to run your express app
app.listen(5555, () => console.log('Server running...\nListening on port: 5555')); 
于 2019-06-06T16:17:56.377 に答える
0

完全を期すために複数のソリューションをまとめる

ストアドプロシージャ:

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

(ソースクレジット:PushkerYadavおよび" http://www.javascriptpoint.com/nodejs-mysql-tutorial-example/ ")

于 2017-11-24T16:48:36.753 に答える