2014-05-22 26 views
8

Tôi đã bắt đầu sử dụng lời hứa, tôi sử dụng Node.js Mango (với mongoose) và bluebird .. Vấn đề tôi gặp phải là vì một số lý do khi tôi kết nối cuộc gọi mongoose với chức năng quay trở lại những lời hứa (tôi giả sử đây là cách chính xác để trở lại và chuỗi) sau đó tôi nhận được:JavaScript Hứa hẹn và thiếu bluebird bắt và thất bại

typeError: Object #<Promise> has no method 'fail' 

nếu tôi thay đổi thất bại trong việc bắt sau đó tôi nhận được cùng một vấn đề:

typeError: Object #<Promise> has no method 'catch' 

những gì tôi làm là sử dụng chức năng (null, hàm) mẫu chính xác là không thành công nd bắt. Tuy nhiên, bắt/lỗi là dễ đọc hơn. Bất kỳ đầu mối nào tại sao tôi nhận được điều này và cách tôi nên giải quyết vấn đề này?

Dưới đây là ví dụ về khối mã.

User.findOne({ 'email' : user_email }).exec() 
}).then (promisedTransformUserSchemaToFrontendObjectWithProjectMapping) 
    .then (function (feUser) { 
     return new Promise(function (resolve, reject) { 
      res.json(feUser); 
      return resolve(feUser); 
     }); 
    }).fail/catch (function (err) { 
     console.log(err); 
     sendError(res,"failed to get user",err); 
    }); 

Và đây là stacktrace:

TypeError: Object #<Promise> has no method 'catch' 
    at module.exports.app.put.User.update.email (app\controllers\router.js:165:16) 
    at callbacks (node_modules\express\lib\router\index.js:164:37) 
    at isLoggedIn (app\controllers\router.js:741:10) 
    at callbacks (node_modules\express\lib\router\index.js:164:37) 
    at param (node_modules\express\lib\router\index.js:138:11) 
    at param (node_modules\express\lib\router\index.js:135:11) 
    at pass (node_modules\express\lib\router\index.js:145:5) 
    at Router._dispatch (node_modules\express\lib\router\index.js:173:5) 
    at Object.router (node_modules\express\lib\router\index.js:33:10) 
    at next (node_modules\express\node_modules\connect\lib\proto.js:193:15) 
+0

bạn có thể chia sẻ dấu vết ngăn xếp không? –

+2

Không sử dụng các lời hứa trả về bởi mongoose, chỉ promisifyAll và sử dụng '* Async' phương pháp độc quyền – Esailija

+0

Ngoài ra,' mới Promise' bit bị từ hoãn mô hình – Esailija

Trả lời

15

mongoose 4.1+ duy trì gợi ý:

es2015 (es6):

require('mongoose').Promise = Promise; 

bluebird:

require('mongoose').Promise = require('bluebird'); 

Q:

require('mongoose').Promise = require('q').Promise; 
+0

điều này thật tuyệt vời. cảm ơn bạn rất nhiều! – sabrehagen

+0

tại sao chỉ có +3? sử dụng yêu cầu ('mongoose'). Promise = Promise; dễ dàng thêm hỗ trợ bắt và làm cho thế giới của tôi tốt hơn. Cảm ơn rất nhiều!! – Sulliwane

5

Tôi không biết moongose, nhưng nhìn chung, các chức năng như thất bại hoặc bắt những phím tắt tiện lợi và không phải là một phần của những lời hứa spec. Như vậy thư viện không cần phải có chúng để được tuân thủ các lời hứa. Rõ ràng trong trường hợp của bạn họ không có ở đó.

Bạn có thể đạt được cùng chức năng với then(successHandler, rejectionHandler).

Để xử lý từ chối lời hứa, bạn có thể viết lại mã của bạn như sau:

User.findOne({ 'email' : user_email }).exec() 
}).then (promisedTransformUserSchemaToFrontendObjectWithProjectMapping) 
    .then (function (feUser) { 
     return new Promise(function (resolve, reject) { 
      res.json(feUser); 
      return resolve(feUser); 
     }); 
    }).then (undefined, function (err) { 
     console.log(err); 
     sendError(res,"failed to get user",err); 
    }); 
+0

vâng tôi đã viết đó là những gì tôi đang làm bây giờ .... –

+0

Tôi nghĩ bắt được ít nhất MDN đã có nó trên đó trong các tài liệu cùng với lời hứa. tất cả đều từ chối và giải quyết. –

0

Dường như vấn đề đã được pha trộn hai loại lời hứa (bluebird và cầy mangut) ..

Khi tôi sử dụng promsifyAll trên đối tượng db, đánh bắt bắt đầu làm việc ..

// promisify all model using mongoomise.. 
 
require('../../mongoomise').promisifyAll(mongoose, require('bluebird'))

+0

bạn có thể đăng mã làm việc tại đây –

+0

@MuhammadUmer thử đoạn mã nhỏ này mà tôi đã thêm vào, tôi hy vọng nó sẽ giúp ích. –

+0

Nếu bạn sử dụng mongoose 4.1.0 (phát hành 2015-07-24) hoặc cao hơn thì bạn không nên sử dụng 'promisify' với mongoose. Câu trả lời của Jason Sebring nên được ưa thích hơn (ý kiến ​​của tôi là giải pháp được đánh dấu phải được thay đổi). http://mongoosejs.com/docs/promises.html#plugging-in-your-own-promises-library – ippi

3

Một cách khác để làm điều đó được thể hiện trong các tài liệu bluebird:

https://github.com/petkaantonov/bluebird/blob/master/API.md#promiseresolvedynamic-value---promise

Bạn có thể quấn lời hứa mongoose trong Promise.resolve bluebird của(), và bạn sẽ nhận lại một lời hứa bluebird.

Promise.resolve(User.findOne({ 'email' : user_email }).exec()) 
.then (promisedTransformUserSchemaToFrontendObjectWithProjectMapping) 
    .then (function (feUser) { 
      res.json(feUser); 
      return feUser; 
    }).fail/catch (function (err) { 
     console.log(err); 
     sendError(res,"failed to get user",err); 
    }); 
Các vấn đề liên quan