我有3个表(服务,实践者,网络)在我的postgres数据库,我希望他们都显示在我的API,但我得到了这个错误
(节点:21300)UnhandledPromiserEjectionWarning:Error[ERR_HTTP_HEADERS_SENT]:发送到客户端后无法设置标头
这是我能得到json响应的唯一输出
这是我的密码。
null
const handler = (req, res, db, tableName) => {
try{
db.select('*').from(tableName)
.then(data => {
if(data.length){
res.status(200).json({tableName: data});
}
})
}catch(err){
res.status(400).json(err)
}
}
const content = (req, res, db) => {
handler(req, res, db, 'services')
handler(req, res, db, 'practitioners')
}
module.exports = { content };
null
我推荐你这样使用promise:
async function getData(tableName) {
return new Promise(function (resolve, reject) {
db.select("*")
.from(tableName)
.then((data) => {
resolve(data);
});
});
}
async function run(){
var allTable = [];
const firstTable = await getData('testingDB');
const secondTable = await getData('user');
allTable.push(firstTable);
allTable.push(secondTable);
res.status(200).json({data: allTable});
}
run().then(() => {
console.log("Finished!");
})
我看到了一些潜在的问题。 未处理的承诺拒绝:在then之后添加一个catch块(您可以重新抛出以将其放在现有的catch块中)。
.then(data => {
if(data.length){
let responseData = {}
responseData[tableName] = data
res.status(200).json(responseData)
}
})
.catch(err) {throw err}
tablename
也不会被解释为变量,而是被解释为文字属性名,因此我更改了它以获得我认为您想要的结果。
对于报头错误,您要设置两次响应,一次为“services”,然后再一次为“实践者”。 一个可能的解决方案是从处理程序中删除res.status...
行,并在内容中使用promise.all,然后将响应设置移到其中:
const content = (req, res, db) => {
Promise.all(
handler(req, res, db, 'services')
handler(req, res, db, 'practitioners')
)
.then(allData => {
//use reduce/Object.assign to combine the individual data objects
allData.reduce((finalResponseData, data) => {
if(!data.length) return finalResponseData
Object.assign(finalResponseData, data)
})
.then(finalResponseData => res.status(200).json(finalResponseData)
.catch(err) {res.status(400).json(err)}
}