首页 > 解决方案 > 尝试在访问 Azure SQL 时使用 Express、Tedious 发送正确的标头

问题描述

我的后端收到从 Azure SQL 数据库获取记录的请求。为了管理这个请求,我在 Nodejs 中使用 Express 和 Tedious(连接到 DB)。当对适当路由的请求进来时,Tedious 打开与 db 的连接,查询它,它应该将响应发送回前端。

但是,代码在我从数据库得到答案之前做出响应,因此当我发送真实(实际需要的)响应时,Express 告诉我它已经发回了标头(可怕的:'无法设置标头之后发送给客户')。

在调试了相当多(使用几个 console.log(JSON.stringify(resp.headersSent)); )查看响应实际发送的时间后,我注意到它是在我连接 Azure 的那一刻发送的(见下文)。

我不确定我是否遗漏了一些东西(尽管我已经检查了所有这些程序的文档),但是我如何控制何时发送响应?或者,是否有另一种方法可以做到这一点。

为简洁起见,我省略了其他几条路线。其他路线工作正常,因此我知道代码可以很好地连接到 Azure db,并且前端确实可以正确查询后端。帮助表示赞赏。谢谢你。

const express = require('express');
const cors = require('cors');
const Connection = require('tedious').Connection;
const Request = require('tedious').Request;

const config = {
  authentication: {
    options: {
      userName: "xxxx", 
      password: "xxxx" 
    },
    type: 'default'
  },
  server: "xxxx", 
  options: {
    database: "xxxx",
    encrypt: true
  }
};

const app = express();
app.use(express.json({type: '*/*'}));
app.use(cors({ origin: '*' }));

app.get("/allproj/", function (req, resp) {
  const q = `select Title, Report_Date, Project_Number, Phase_Code, Items_No, PId from projec order by PId desc`;
  let ansf = [];
  
  const connection = new Connection(config);

  connection.on('connect', (err, connection) => {
    if (err) {
      console.log(err);
    } else {                  //this is the moment the headers are sent, 
                              //seemingly with positive response from connection
      queryItems(q);
    }
  });
  
  queryItems = (q) => {

    request = new Request(q, function (err, rowCount) {
      if (err) {
        console.log(err);
      } else {
        console.log(rowCount + ' rows pulled');
        connection.close();
      }
    });

    request.on('row', function(columns) {
      let ans = [];
      columns.forEach(function(column) {
        ans.push(column.value);
        if (ans.length === 6) {  // I know each row is 6 cols long
          ansf.push(ans);
          ans = [];
        }
      });
      console.log('ansf length: ' + ansf.length);
      resp.send({ ansf });          // This is the response I would like to return
    });

    request.on('done', function(rowCount) {
      console.log(rowCount + ' rows returned');
      connection.close();
    });

    connection.execSql(request);    
  };

  resp.redirect("/");
});

app.listen(3000, process.env.IP, function() {
  console.log("Started OK...");
});

标签: node.jsexpressazure-sql-databasehttpresponsetedious

解决方案


删除 resp.redirect("/"); 由于它已经将您的请求转移到“/”并且当控制权到达 resp.send({ansf}) 时,它会给您错误。


推荐阅读