nodejs - 使用mssql运行多个查询

时间:2017-08-24 10:22:35

标签: sql sql-server node.js express post

我有一个express API,其中包含使用mssql的SQL查询的POST请求。这是有效的,并将结果作为JSON返回。我遇到的问题是,当我想在另一个查询仍在运行时多次调用它时...

这是我的代码:

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我的superagent webapp与Error: Global connection already exists. Call sql.close() first. 调用此错误时收到的错误是:

        <div class="pagination">
   //entities -> all products
        {{ knp_pagination_render(entities) }}
        <script>
            var attr = product.id;
            $(document).on("click",".s_p_c_pagination .pagination a",function(evt){
                $('#mainCntData').css("opacity", "0.3");
                $.ajax({
                    type: "POST",
                    url: $(this).attr('href'),
                    data:{ "attarFil" : attr },
                })
                .done(function( data ) {
                       //Result Div
                });
                evt.preventDefault();
            });
        </script>

这很烦人,因为我必须同步调用我的API并等待第一个查询返回,然后才能调用下一个...

有谁知道如何一次运行多个查询?这必须是一个单独的连接,因为我在一个数据库上运行查询,然后是另一个数据库。但是服务器相同。

1 个答案:

答案 0 :(得分: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的限制,而不是库。