2017-08-24 153 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的限制,而不是库。