提问者:小点点

我想将数据库中的所有表显示到一个API中


我有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


共2个答案

匿名用户

我推荐你这样使用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)}
 }