首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Knex在插入后解析空集

Knex在插入后解析空集
EN

Stack Overflow用户
提问于 2016-09-07 16:11:10
回答 1查看 4.7K关注 0票数 2

我正在尝试使用Postgresql和肯奈在Node中建立一个基本的数据库连接,但我很难获得一个看似简单的插入操作。我的大部分代码都是基于中的示例代码。

问题似乎是,我的第一个insert (添加管理用户)解析了一个空行集(因为文档中没有任何关于行或行集的信息)。

这是我的代码:

代码语言:javascript
复制
const knex = require("knex")({
  client: "postgres",
  connection: {
    host     : "127.0.0.1",
    user     : "postgres",
    password : "my password goes here",
    database : "issue-tracker",
    charset  : "utf8"
  }
});

knex.schema
  .dropTableIfExists("tickets")
  .dropTableIfExists("users")
  .createTable("users", createUserTable)
  .createTable("tickets", createTicketTable)
  .then(() => addTestData())
  .then(() => console.log("Done"))
  .catch((e) => console.log(e));

function createUserTable(table) {
  table.increments("id");
  table.string("username").index().unique();
  table.string("password");
  table.timestamps();
}

function createTicketTable(table) {
  table.increments("id");
  table.timestamps();
  table.integer("creator_id").unsigned().references("users.id");
  table.string("text");
}

function addTestData() {
  return Promise.resolve()
    .then(() =>
      knex.insert({username: "admin", password: "password"})
      .into("users")
    )
    .then((rows) =>
      // rows is empty?
      knex.insert({creator_id: rows[0], text: "this is a test"})
      .into("tickets")
    )
    .then(() =>
      knex("users").join("tickets", "users.id", "tickets.creator_id")
      .select("users.id as creator_id", "users.username as creator_name", "tickets.text as text")
    )
    .then(console.log.bind(console));
}

如能提供任何援助,将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-07 16:22:47

承诺处理程序必须返回一些东西。它的工作原理就像一条装配线--每个站都必须把它的工作结果放回生产线上。

  • 除非您显式地告诉行,否则将不返回knex中的Insert操作。康耐视为此拥有.returning() (文档)。
  • 链中的最后一个处理程序(console.log.bind(console))什么也不返回,因此链的最终结果是未定义的。
  • 您不需要使用Promise.resolve()启动承诺链。您可以使用任何承诺返回函数开始它,直接使用knex()在这里是明智的。

所以,稍微重新安排一下,我们的结局是:

代码语言:javascript
复制
function addTestData() {
    return knex("users")
        .returning("user_id")
        .insert({username: "admin", password: "password"})
        .then((rows) => {
            return knex("tickets")
                .returning("ticket_id")
                .insert({creator_id: rows[0], text: "this is a test"});
        })
        .then((rows) => {
            return knex("users")
                .join("tickets", "users.id", "tickets.creator_id")
                .select("users.id as creator_id", "users.username as creator_name", "tickets.text as text");
        })
        .then((rows) => {
            console.log.bind(console);
            return rows;
        });
}

这与此等价,其中return是隐含的,因此不太明显:

代码语言:javascript
复制
function addTestData() {
    return knex("users")
        .returning("user_id")
        .insert({username: "admin", password: "password"})
        .then((rows) => knex("tickets")
            .returning("ticket_id")
            .insert({creator_id: rows[0], text: "this is a test"});
        })
        .then((rows) => knex("users")
            .join("tickets", "users.id", "tickets.creator_id")
            .select("users.id as creator_id", "users.username as creator_name", "tickets.text as text");
        })
        .then((rows) => {
            console.log.bind(console);
            return rows;
        });
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39374802

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档