javascript - Node - 数据库查询回调未触发

标签 javascript node.js postgresql

这可能是一个愚蠢的问题,但我找不到答案。 当从另一个回调调用查询函数本身时,我的数据库查询( Node -> PostgreSQL)不会触发回调,如下所示:

routes.js

router.post("/getsheet/", (req, res) => {

    googleAPI.getSheet(googleToken, req.body.sheetid).then((invoices) => {

        templateData.sheetData = invoices;
        templateData.sheetData.length = invoices.length;

        // When sheet is received, db query runs but it's callback won't
        // function takes an array and index
        db.query(invoices, 1).then((db_results) => {
            console.log(db_results);
            res.redirect("/");
        }).catch((db_error) => {
            console.error(db_error)
            res.redirect("/");
        });

    }).catch((error) => {
        console.error(error);
    });
});

db.js

const query = (data, index) => {
return new Promise((resolve, reject) => {
    // console log fires but not the callback function so it does not resolve or reject
    console.log("... querying index ... " + index + " customer: " + data[index].name);
    client.query(`SELECT * FROM customer WHERE customer_number=${data[index].customer_id};`, (err, res) => {
            // does not run this block
            if (!err) {
                resolve(res);
            } else {
                return reject(err);
            }
    });
});

}

谢谢! :)

最佳答案

您已经建立连接了吗?在尝试运行查询之前,您需要先执行此操作。请参阅此处的示例: http://mherman.org/blog/2015/02/12/postgresql-and-nodejs/#.WeJpJWhSyUk

  pg.connect(connectionString, (err, client, done) => {
    // Handle connection errors
    if(err) {
      done();
      console.log(err);
      return res.status(500).json({success: false, data: err});
    }
    // SQL Query > Select Data
    const query = client.query('SELECT * FROM items ORDER BY id ASC;');
    // Stream results back one row at a time
    query.on('row', (row) => {
      results.push(row);
    });
    // After all data is returned, close connection and return results
    query.on('end', () => {
      done();
      return res.json(results);
    });
  });

此外,我强烈建议您使用npm pg-promise。将简化您的生活。

最后,您还忽略了 promise 的要点。我鼓励您使用较新的 async/await。但是,如果您不想和/或不能,至少看看为什么您会回到回调 hell …… promise 已经到位,可以帮助减少所有回调嵌套。实际上,您应该减少您的 promise 的嵌套级别,如下所示:

router.post("/getsheet/", (req, res) => {

    googleAPI.getSheet(googleToken, req.body.sheetid).then((invoices) => {

        templateData.sheetData = invoices;
        templateData.sheetData.length = invoices.length;

        // When sheet is received, db query runs but it's callback won't
        // function takes an array and index
        return db.query(invoices, 1);
    }).then((db_results) => {
        console.log(db_results);
        res.redirect("/");
    }).catch((error) => {
        console.error(error);
        res.redirect("/");
    });
});

关于javascript - Node - 数据库查询回调未触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46748498/

相关文章:

javascript - 访问根公共(public)目录nodejs

postgresql - 如何比较两个 TIMESTAMP 列以检查最多 15 分钟的差异?

mysql - 根据可变条件选择多个单个(LIMIT 1)记录

postgresql - 通过 kubernetes 作业创建或更新现有的 postgres 数据库容器

javascript - 计算 XSL for-each 循环中的元素数?

JavaScript 函数在循环迭代器中循环问题?

javascript - 如何为 minio 上的存储桶设置大小限制?

javascript - jQuery 数据表 : Sort on one column when clicking on another.

javascript - NodeJS 将 Promise 转换为 Promise.all

php - 一次运行多个 puppeteer