【问题标题】:I want to show all my tables from my database to an API我想将我的所有表从我的数据库显示到一个 API
【发布时间】:2020-06-06 00:18:00
【问题描述】:

我的 postgres 数据库中有 3 个表(服务、从业人员、网络),我希望它们都显示在我的 API 中,但出现此错误

(node:21300) UnhandledPromiseRejectionWarning: 错误 [ERR_HTTP_HEADERS_SENT]: 发送到客户端后无法设置标头

这是我能得到的唯一输出 json response

这是我的代码。

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 };

编辑: 这是我从Nabil Farhan 的回答中所做的,它的工作正是我想要的。 screenCapture

const getData = async (db, tableName) => {
    return new Promise((resolve, reject) => {
        db.select('*').from(tableName)
                      .then(data => {
                          resolve({[tableName]:data})
                      })
    });
}

const contentHandler = async (req, res, db) => {
    // get the argument from get request

    let allTable = [];

    const table_a = await getData(db, 'services');
    const table_b = await getData(db, 'practitioners');

    allTable.push(table_a);
    allTable.push(table_b);
    
    res.status(200).json({data: allTable});
}

module.exports = { contentHandler };

【问题讨论】:

    标签: javascript node.js postgresql api server


    【解决方案1】:

    我建议你像这样使用 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!");
    })
    

    【讨论】:

      【解决方案2】:

      我在这里看到了几个潜在的问题。 未处理的 Promise 拒绝: 之后添加一个 catch 块(您可以重新抛出以将其放入现有的 catch 块中)。

      .then(data => {
            if(data.length){
                 let responseData = {}
                 responseData[tableName] = data
                 res.status(200).json(responseData)
            }
       })
       .catch(err) {throw err}
      

      tableName 也不会被解释为变量,而是作为文字属性名称,所以我对其进行了更改以得到我认为你想要的。

      对于标头错误,您设置了两次响应,一次用于“服务”,然后再次用于“从业者”。一种可能的解决方案是从处理程序中删除 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)}
       }
      

      【讨论】:

      • 谢谢!我真的很感谢你的帮助。虽然它仍然有 UnhandledPromiseRejectionWarning。我仍然可以将其用作将来的参考。谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-29
      • 1970-01-01
      相关资源
      最近更新 更多