2016-09-07 3 views
1

PostgreSQLとKnexを使用してノードで基本的なデータベース接続をセットアップしようとしていますが、単純な挿入がうまくいかないように思えます。私はこのコードのほとんどをKnex github repoのサンプルコードに基づいています。挿入後に空のセットを解決するKnex

問題は、最初の挿入(管理者ユーザーを追加する)が、空の行セットを解決しているように思えます(ドキュメントに行または行セットについての情報が含まれていないため見つけることができます)。どのような援助がはるかに高く評価されるだろう

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

は、ここに私のコードです。

答えて

2

プロミスハンドラは何かを返さなければなりません。組立ラインのように機能します。各ステーションは、作業の結果をラインに戻さなければなりません。

  • knexでの挿入操作は、明示的に指示しない限り行を返しません。 Knexはそのために.returning()を持っています(docs)。
  • チェーンの最後のハンドラ(console.log.bind(console))は何も返しません。したがって、チェーンの最終結果は未定義です。
  • Promise.resolve()で約束を開始する必要はありません。約束を返す関数で始めることができます。ここではknex()を直接使用することができます。

ので、少し再配置され、私たちはこれで終わる:

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; 
     }); 
} 
+0

このISN:

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が暗示ので、あまり目立たないときは、この、と等価です問題はありません。私はどんな価値を解決しようとはしていない。私はちょうどユーザーを挿入し、そのIDを解決し、(挿入されたユーザーのIDに設定されたcreator_idで)チケットを挿入しようとしています。 'addTestData'は私が気にするものは何も解決できません。問題は、最初の挿入後に 'rows'が空であることです。 – SimpleJ

+0

ああ。 insert文は通常、行を返しません。挿入された値を取得する方法については、https://github.com/tgriesser/knex/issues/732をご覧ください。 – Tomalak

+1

ありがとう!問題は私が '返却 'メソッドを使用していないことでした。今働いている。あなたの答えを編集したい場合は、私はそれを受け入れます。 – SimpleJ

関連する問題