ストアドプロシージャをサポートするnodejs用のmySQLドライバーを探しています。私が使用しているhttp://nodejsdb.org/db-mysql/はエラーを出します
PROCEDUREは、指定されたコンテキストで結果セットを返すことができません
ストアドプロシージャをサポートするnodejs用のmySQLドライバーを探しています。私が使用しているhttp://nodejsdb.org/db-mysql/はエラーを出します
PROCEDUREは、指定されたコンテキストで結果セットを返すことができません
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 ...
}
});
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に関する良いチュートリアルがあります
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!
これは回答済みですが、私は自分のバージョンで貢献します。それがあなたやこの投稿に出くわした他の人の助けになることを願っています
あなたの場合、これは私が単一のファイルで、あなたが達成しようとしていることを(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'));
完全を期すために複数のソリューションをまとめる
ストアドプロシージャ:
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/ ")