node.js - 尝试在访问 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...");
});
解决方案
删除 resp.redirect("/"); 由于它已经将您的请求转移到“/”并且当控制权到达 resp.send({ansf}) 时,它会给您错误。
推荐阅读
- angular - DecimalPipe 中的逗号分隔符
- swift - 如何处理从 API 返回的联合类型?
- c - 可变长度数组指令是如何生成的?
- javascript - p5js或js处理的目的是什么
- amazon-ec2 - SSH 连接被 EC2 实例拒绝
- c# - 将字符串转换为 24 小时日期时间格式
- javascript - 调整圆圈大小文本和 svg 大小
- python - Python pandas 对 groupby 语法的清晰说明
- typescript - 类型细化“忘记”语句中的值?
- asp.net - 无法使用 EF Core 访问 Azure sql - 首先是代码,但可以先使用数据库