2017-08-24 30 views
0

express APIを使用して、mssqlを使用してSQLクエリを含むPOSTリクエストがあります。これは動作しており、JSONとして結果を返します。nodejs - mssqlを使用して複数のクエリを実行する

app.post('/select', (req, res) => { 
    config.database = req.body.db; 

    var sqlQuery = `SELECT ${req.body.select} FROM ${req.body.from}`; 
    if (req.body.where !== '' && req.body.where !== undefined) sqlQuery += ` WHERE ${req.body.where}`; 
    if (req.body.order !== '' && req.body.order !== undefined) sqlQuery += ` ORDER BY ${req.body.order}`; 
    console.log(`Query: ${sqlQuery}`); 

    sql.connect(config).then(pool => { 
    return pool.request().query(sqlQuery) 
    }).then(result => { 
    sql.close(); 
    sqlDone = true; 
    console.dir(result); 
    res.header('Content-Type', 'Application/JSON'); 
    res.json(result.recordset); 
    }).catch(err => { 
    sql.close(); 
    sqlDone = true; 
    console.log('Caught Error:'); 
    console.log(err); 
    }); 
    sql.on('error', err => { 
    sql.close(); 
    console.log('SQL Request Error:'); 
    console.log(err); 
    }); 
}); 

私は私からこれを呼び出すときに私が取得エラー:私は、他のクエリはまだここ..

を実行している間、何度もこの多くを呼び出したいときに私が持っている問題は、私のコードですsuperagentreact Webアプリケーションは、次のとおりです。

Error: Global connection already exists. Call sql.close() first. 

私は同期私のAPIを呼び出すと、最初のクエリが返すようにするために、私は次のいずれかを呼び出すことができます前に、待たなければならないので、これは刺激性..です

一度に複数のクエリを実行する方法を知っている人はいますか?これは別の接続でなければなりません。なぜなら、私は1つのデータベースに対してクエリを実行しているからです。しかし、同じサーバー。

+1

どのsqlモジュールを使用していますか? isOpenのようなメソッドがありますか? connectを呼び出す前に接続がすでに開いているかどうかをテストする必要があります。 – SPlatten

+0

これは次のとおりです:https://www.npmjs.com/package/mssql – Timmo

+1

私はそのようなメソッドを見ることはできませんが、コールされたときにフラグを設定してこれをテストするために、あなたの接続ルーチンにブール変数を作成することができますもう一度電話する前に。 – SPlatten

答えて

0

私はあなたが一度に複数のクエリを実行することはできません恥の@SPlatten

app.post('/select', (req, res) => { 
    waitUntil() 
    .interval(500) 
    .times(60) 
    .condition(() => { 
     return (sqlDone ? true : false); 
    }) 
    .done((result) => { 
     sqlDone = false; 
     sql.connect(config).then(pool => { 
     console.log(); 
     console.log('Connected!'); 

     config.database = req.body.db; 

     var sqlQuery = `SELECT ${req.body.select} FROM ${req.body.from}`; 
     if (req.body.where !== '' && req.body.where !== undefined) sqlQuery += ` WHERE ${req.body.where}`; 
     if (req.body.order !== '' && req.body.order !== undefined) sqlQuery += ` ORDER BY ${req.body.order}`; 

     console.log(`Query: ${sqlQuery}`); 
     return pool.request().query(sqlQuery); 
     }).then(result => { 
     sql.close(); 
     sqlDone = true; 
     console.log(); 
     console.log('Result:'); 
     console.dir(result.recordset); 
     res.header('Content-Type', 'Application/JSON'); 
     res.json(result.recordset); 
     }).catch(err => { 
     sql.close(); 
     sqlDone = true; 
     console.log(); 
     console.error('Caught Error:'); 
     console.error(err); 
     res.status(500).send({ error: err }); 
     }); 
     sql.on('error', err => { 
     sql.close(); 
     sqlDone = true; 
     console.log(); 
     console.error('SQL Error:'); 
     console.error(err); 
     res.status(500).send({ error: err }); 
     }); 
    }); 

}); 

ビットにより示唆されるようにブール値が真になるまで待つようにwait-untilライブラリを使用して、この乗り越えるために管理しているOKけど私はこれがSQLの限界だと思います。ライブラリではありません。

関連する問題