【问题标题】:Access array values after knex SELECT在 knex SELECT 之后访问数组值
【发布时间】:2020-11-27 21:39:07
【问题描述】:

我在 Electron 应用程序中有以下代码 sn-p 来检索 sqlite3 数据库中的给定列:

database.js

var database = require("knex")({
    client: "sqlite3",
    connection: {
        filename: path.join(__dirname, 'db/food.db')
    },
  useNullAsDefault: true
});

const fetchItems = (colName) => {
  let itemList = database.select(colName).from('food')
  itemList.then(() => {
    // console.log(itemList);
    return itemList;
  }).catch((err) => {
    console.log(err)
    return [];
  })
}

当我尝试访问数组 itemList 时,我收到了一条消息 undefined。当我尝试将其打印到控制台时,它会显示数据库对象的冗长信息,如下所示:

Builder [object] {
  client: Client_SQLite3 {
    config: { client: 'sqlite3', connection: [Object], useNullAsDefault: true },
    logger: Logger {
      _inspectionDepth: 5,
      _enableColors: true,
      _debug: undefined,
      _warn: undefined,
      _error: undefined,
      _deprecate: undefined
    },
    connectionSettings: {
      filename: '/home/.../db/food.db'
    },
    connectionConfigExpirationChecker: null,
    driver: {
      Database: [Function: Database],
      Statement: [Function: Statement],
      Backup: [Function: Backup],
      OPEN_READONLY: 1,
...

如何访问值的数组(即列)?谢谢。

更新:这是我在main.js 中调用此fetchItems 函数的方式。

const database = require('./database');

ipcMain.on("showItemsButtonClicked", function () {
        let itemList = database.fetchItems('food_name');

        itemList.then(() => {
            mainWindow.webContents.send("itemsRetrieved", itemList);
        })
        console.log(itemList);
    });

【问题讨论】:

    标签: javascript node.js electron knex.js node-sqlite3


    【解决方案1】:

    我认为你使用了错误的语法。

      const fetchItems = (colName) => {
      let itemList = database.select(colName).from('food').then((res) => {
        // console.log(res);
        return res;
      }).catch((err) => {
        console.log(err)
        return [];
      })
     return itemList
    }
    

    使用异步等待:

    const fetchItems = async(colName) => {
      try {
        let itemList = await database.select(colName).from('food')
        return itemList
      } catch(err) {
        console.log(err)
        return [];
      }
    }
    

    【讨论】:

    • 谢谢。我在我的问题中添加了更多细节。我尝试了你的两个建议。第一个建议:我可以正确打印到控制台res,但res 没有返回到fetchItems 函数(因此,main.js 没有收到它)。第二:我得到了Javascript error in main process. Erros: failed to serialize arguments...
    • 好的,我又试了一次,async await 解决方案对我有用(需要修改main.js 代码才能收到承诺)。谢谢。关闭这个。
    猜你喜欢
    • 2011-05-22
    • 2020-03-20
    • 1970-01-01
    • 1970-01-01
    • 2014-01-03
    • 1970-01-01
    • 2015-10-02
    • 1970-01-01
    • 2011-08-14
    相关资源
    最近更新 更多