2016-04-29 20 views
0

Wenn Skript unten beginnend, bekam ich einen Fehler, die `waitForIndex` funktioniert nicht richtig

Something bad heppened while waiting for index created 
Index `createdAt` was not found on table `olive.todos` 
r.table("todos").indexWait("createdAt") 
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 

aber ausgehend Skript wieder auf

stecken, ich habe kein Problem.

Ist das RethinkDB Problem oder meins? Und sag mir die Lösung.

const createIndex = (conn, tableName, indexName) => 
    r.table(tableName).indexList().contains(indexName) 
    .do(containsIndex => 
     r.branch(
     containsIndex, 
     { created: 0 }, 
     r.table(tableName).indexCreate(indexName) 
    ) 
    ) 
    ... 

const waitForIndex = (conn, tableName, indexName) => 
    r.table(tableName).indexWait(indexName) 
    ... 

export const setup = startApp => { 
    r.connect(config.rethinkdb) 
    ... 
    .then(conn => { 
     Promise.all([ 
     createIndex(conn, 'todos', 'createdAt'), 
     createIndex(conn, 'days', 'date'), 
     ]); 
     return conn; 
    }) 
    .then(conn => 
     Promise.all([ 
     waitForIndex(conn, 'todos', 'createdAt'), 
     waitForIndex(conn, 'days', 'date'), 
     ]) 
    ) 
    ... 
}; 

Antwort

1

Sie scheint die API der verschiedenen Promise API gemischt. Ich sehe nicht, dass Sie Promise von überall importieren. Ich soll Ihnen eingebaut sind mit JavaScript Versprechen https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

Wenn Sie Promise.all verwenden, haben Sie an die Kette mit then, statt mit return als nächste Anweisung. Kette zu then mit Resolver/Reject.

Ihr Code Verwendung return so direkt nach Promise.all aber nicht nennen then, so kehrt instanly und der Index hat noch nicht fertig erstellt werden.

Dieser Code funktioniert:

import r from 'rethinkdb'; 
import config from '../config'; 

const createDatabase = (conn, name) => 
    r.dbList().contains(name) 
    .do(containsDb => 
     r.branch(
     containsDb, 
     { created: 0 }, 
     r.dbCreate(name) 
    ) 
    ) 
    .run(conn) 
    .error(err => { 
     console.log(`Could not create ${name} DB`); 
     console.log(err.message || 'Something bad happened'); 
     process.exit(1); 
    }); 

const createTable = (conn, name) => 
    r.tableList().contains(name) 
    .do(containsTable => 
     r.branch(
     containsTable, 
     { created: 0 }, 
     r.tableCreate(name) 
    ) 
    ) 
    .run(conn) 
    .error(err => { 
     console.log(`Could not create ${name} table`); 
     console.log(err.message || 'Somthing bad happened'); 
     process.exit(1); 
    }); 

const createIndex = (conn, tableName, indexName) => 
    r.table(tableName).indexList().contains(indexName) 
    .do(containsIndex => 
     r.branch(
     containsIndex, 
     { created: 0 }, 
     r.table(tableName).indexCreate(indexName) 
    ) 
    ) 
    .run(conn) 
    .error(err => { 
     console.log(`Could not crate index ${indexName} in ${tableName}`); 
     console.log(err.message || 'Something bad happened'); 
     process.exit(1); 
    }); 

const waitForIndex = (conn, tableName, indexName) => 
    r.table(tableName).indexWait(indexName) 
    .run(conn) 
    .error(err => { 
     console.log('Something bad happened while waiting for index created'); 
     console.log(err.message || 'Something bad happened'); 
     process.exit(1); 
    }); 

export const setup = startApp => { 
    r.connect(config.rethinkdb) 
    .then(conn => { 
     createDatabase(conn, 'test'); 
     return conn; 
    }) 
    .then(conn => { 
     return Promise.all([ 
     createTable(conn, 'todos'), 
     createTable(conn, 'days'), 
     ]).then((result) => conn, (reason) => conn) 
    }) 
    .then(conn => { 
     return Promise.all([ 
     createIndex(conn, 'todos', 'createdAt'), 
     createIndex(conn, 'days', 'date'), 
     ]).then(() => conn,() => conn) 
    }) 
    .then(conn => { 
     return Promise.all([ 
      waitForIndex(conn, 'todos', 'createdAt'), 
      waitForIndex(conn, 'days', 'date'), 
     ]) 
     } 
    ) 
    .then(() => { 
     console.log('DB and tables are available, starting Koa ...'); 
     startApp(); 
    }) 
    .error(err => { 
     console.log('Could not open a connection to initiailize the database'); 
     console.log(err.message || 'Something bad happened'); 
     process.exit(1); 
    }); 
}; 

setup() 

Beachten Sie, dass wir verwenden then haben conn Objekt zu überliefern, nicht durch die Rückkehr

+0

Danke! Jetzt verstehe ich, was das Problem ist. Um sicherzustellen, dass 'Return conn' aufgerufen wird, nachdem' Promise.all' aufgerufen wurde, muss mit 'then' verkettet werden. – nishitani

+0

Können Sie bitte die Antwort akzeptieren :). Vielen Dank – kureikain

0

Ich denke, alles sieht gut aus, aber Ihnen fehlt die .run(conn) Teil der Abfragen. Ändern Sie dies zu tun sollte es tun:

const createIndex = (conn, tableName, indexName) => 
    r.table(tableName).indexList().contains(indexName) 
    .do(containsIndex => 
     r.branch(
     containsIndex, 
     { created: 0 }, 
     r.table(tableName).indexCreate(indexName) 
    ) 
    ).run(conn); 
    ... 

const waitForIndex = (conn, tableName, indexName) => 
    r.table(tableName).indexWait(indexName).run(conn) 
    ... 

export const setup = startApp => { 
    r.connect(config.rethinkdb) 
    ... 
    .then(conn => { 
     Promise.all([ 
     createIndex(conn, 'todos', 'createdAt'), 
     createIndex(conn, 'days', 'date'), 
     ]); 
     return conn; 
    }) 
    .then(conn => 
     Promise.all([ 
     waitForIndex(conn, 'todos', 'createdAt'), 
     waitForIndex(conn, 'days', 'date'), 
     ]) 
    ) 
    ... 
}; 
+0

Danke für die Beantwortung, aber '...' 'enthält bereits .run (conn) ', und es sollte ein anderes Problem geben. (Entschuldigung, für meine Auslassung ... Ich konnte nicht den gesamten Code einfügen, weil es zu lang war.) – nishitani

+0

Der gesamte Code hier verfügbar, [https://gist.github.com/nishiyaniyuki/cb579a0aba7821028e49c0d483a377cf](https://gist .github.com/nishitaniyuki/cb579a0aba7821028e49c0d483a377cf) – nishitani