2016-03-22 5 views
2

knex.jsを使用してSQLを生成して実行しています。既存のテーブルにフィールドを追加するときにエラーをトラップするのに問題があり、documentationはこの特定のケースをカバーしていません。重複したフィールドを追加しようとすると、コンソール(VSCODE)にエラーが返されますが、標準イベントはエラーで呼び出されないため、コードでトラップできません。ここでは、コードです:Knex.JSでフィールドを追加するときにエラーをキャッチする方法

knex.schema.table(tableName, function(table) { 

    table.string('test').catch(function(e) { 
     callback(e) 
    }); 

}).then(function(e) { 
    callback(e); 
}).catch(function(e) { 
    callback(e); 
}) 

これはVSCODEコンソールに返されます。

{ [TypeError: table.string(...).catch is not a function] '[email protected]': { accessToken: undefined } } 

しかし、コールバックのどれが呼び出されません。フィールドの追加時にエラーを確認するにはどうすればよいですか?

UPDATE#1このコードはコールバックを呼び出しますが、明らかにエラー情報はありません。そして、同じエラーにかかわらず、コンソールに表示されます。

table.string('test').catch(
    callback(null, Lib.returnEvent(false)) 
); 

UPDATE#2んが、コールバックは、次のコードで呼ばれていません。この例ではUPDATE#3最初のコールバック

knex.schema.table(tableName, function(table) { 
    table.string('ddd'); 
}).then(function(e) { 
    callback(e); 
}).catch(function(e) { 
    callback(e); 
}) 

次の呼び出しで関数がハングします。

knex.schema.table(tableName, function(table) { 
    table.string('ddd'); 
    callback(true); 
}).then(function(e) { 
    callback(true, e); 
}).catch(function(e) { 
    callback(false, e); 
}) 
+0

あなたのエラーが約束を返さないtable.string( 'テスト') '原因table.string( 'テスト')'についてですオブジェクト。 そのキャッチを削除すると、後で追加されたキャッチでエラーをキャッチできますか? – szinter

+0

いいえ、単にtable.string( 'test')を呼び出すと、フィールドが最初に追加されます。しかし、重複している場合は、エラーがスローされないようです。成功したか失敗したかにかかわらず、外側の 'then'も 'catch'も呼び出されません。しかし、コンソールウィンドウに「ER_DUP_FIELDNAME」というメッセージが表示されます。 – ASA2

+0

上に新しいコードサンプルがあります。 table.string()の呼び出しの直後にコールバックを追加しても、この関数の2番目の呼び出しは常にハングします。 – ASA2

答えて

2

これを解決できましたpromisesアプローチを使用するのではなく、Knexコールバックアプローチに切り替えて問題を解決してください。このコードは、一貫して動作します:

knex.schema.table(tableName, function(table) { 

    table.string(tableFieldname); 

}).asCallback(function(err) { 

    if (err) { 
     callback(false, err); 
    } else { 
     callback(true); 
    } 
}) 
0

これが私の作品

return knex('users') 
     .insert({ 
      username: req.body.username, 
      password: hash, 
     }) 
     .returning('*') 
     .bind(console) 
     .then(console.log) 
     .catch(console.error); 
関連する問題