2017-08-24 154 views
0

我有一個express API,其POST請求包含使用mssql的SQL查詢。這是工作,並返回作爲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); 
    }); 
}); 

我得到的,當我把這個從錯誤中我react Web應用程序與superagent是:

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

這是刺激性的,因爲我有同步調用我的API,然後等待第一個查詢返回,這樣我纔可以撥打下一個..

有誰知道如何一次運行多個查詢?這將不得不是一個單獨的連接,因爲我正在一個數據庫然後另一個運行查詢。雖然是同一臺服務

+1

你正在使用哪個sql模塊?它有像isOpen這樣的方法嗎?在調用連接之前,您需要測試連接是否已經打開。 – SPlatten

+0

這是︰https://www.npmjs.com/package/mssql – Timmo

+1

我看不到這樣的方法,但你可以在你的連接例程中創建一個布爾變量設置標誌,當它已被調用,然後測試這個再次打電話之前。 – SPlatten

回答

0

確定我已成功使用wait-until庫要等到由@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 }); 
     }); 
    }); 

}); 

位丟人的,你不能同時運行多個查詢的布爾是真實的讓過去這一點,但我想這是SQL的限制,而不是庫。