2015-03-05 23 views
6

Tôi đang học node.js và đã gặp knex.js và bookshelf.js để giao tiếp với các cơ sở dữ liệu khác nhau. Tôi đang cố gắng để chạy một chương trình knex đơn giản nhưng bằng cách nào đó chương trình không bỏ thuốc lá. Bên dưới là chương trình:cuộc gọi db knex.js không hoàn thành

'use strict'; 
console.log('Getting knex'); 
var knex = require('./knex')({ 
    client: 'mysql', 
    connection: { 
    host: '127.0.0.1', 
    user: 'shankhoneer', 
    password: 'password', 
    database: 'knex_test' 
    } 
}); 
debugger; 
console.log('got knex'); 
knex.schema.createTable('users', function(table) { 
    console.log('creating tables'); 
    table.increments('id'); 
    table.string('user_name'); 
}).then (function(msg){ 
    console.log('Completed creation'); 
    console.log(msg); 
    return {inserted: true}; 
}); 

Tôi đã cố gắng gỡ lỗi và thấy rằng knex sử dụng lời hứa bluebird. Vấn đề của tôi là do lối ra không đầy đủ từ lời hứa? Cảm ơn

Trả lời

9

Điều này là do kết nối với cơ sở dữ liệu vẫn mở. Thêm mã sau đây sau khi cuối cùng .then(...) của bạn và nó sẽ ngắt kết nối (do đó thoát khỏi quá trình này):

.finally(function() { 
    knex.destroy(); 
}) 
+0

Cảm ơn, nó làm việc! Bạn có thể vui lòng cho tôi biết nếu cuối cùng là cách để kết thúc lời hứa? Cảm ơn một lần nữa. –

+1

Bạn không cần phải luôn luôn kết thúc một lời hứa cuối cùng. Nó tuân theo các quy tắc của 'try {} catch() {} cuối cùng' của javascript, theo nghĩa là mã bên trong' finally' sẽ luôn được thực hiện ở cuối chuỗi lời hứa. Bạn nên, tuy nhiên, luôn luôn có một 'catch' hoặc người nào khác bạn có thể không bắt lỗi ném. Bluebird là đủ khôn ngoan để rethrow chúng nếu nó không tìm thấy bất kỳ 'catch' trong chuỗi lời hứa của bạn mặc dù. – victorkohl

+1

Thông tin thêm về vấn đề trên [trang Bluebird github] (https://github.com/petkaantonov/bluebird#error-handling). – victorkohl

Các vấn đề liên quan