2015-06-05 17 views
5

Khi sử dụng đường nước ORM, nếu tôi muốn tiêu thụ các api lời hứa bluebird vận chuyển theo mặc định làm thế nào để tôi vượt qua việc xử lý trở lại bộ điều khiển.SailsJS Waterline với Bluebird Promises

Dưới đây là các mã:

module.exports = { 
    //Authenticate 
    auth: function (req, res) { 
     user = req.allParams(); 
     //Authenticate 
     User.authenticate(user, function (response) { 
      console.log(response); 
      if (response == true) { 
       res.send('Authenticated'); 
      } else { 
       res.send('Failed'); 
      } 
     }); 
    } 
}; 


module.exports = { 
    // Attributes 

    // Authenticate a user 
    authenticate: function (req, cb) { 
     User.findOne({ 
      username: req.username 
     }) 
     .then(function (user) { 
      var bcrypt = require('bcrypt'); 
      // check for the password 
      bcrypt.compare(req.password, user.password, function (err, res) { 
       console.log(res); 
       if (res == true) { 
        cb(true); 
       } else { 
        cb(false); 
       } 
      }); 
     }) 
     .catch(function (e) { 
      console.log(e); 
     }); 
    } 
}; 

Tôi chỉ đơn giản là cố gắng để thực hiện một chức năng xác thực. Logic kinh doanh là thẳng về phía trước. Những gì tôi đang nhầm lẫn là làm thế nào dòng chảy yêu cầu được trao lại cho bộ điều khiển kể từ đó. Lời hứa không đáp ứng nếu tôi cố gắng trả lời một câu trả lời, nhưng làm một cb (giá trị) hoạt động.

+0

đâu bạn trở Promise trong mã này? – vanadium23

+0

Theo tài liệu (http://sailsjs.org/#!/documentation/reference/waterline/queries), waterline có một phần thực hiện của Bluebird, tôi đang có gói đầu của tôi xung quanh mã sau khi User.find .. ..then –

Trả lời

7

Chìa khóa để làm việc với các lời hứa là không bao giờ phá vỡ chuỗi. Chuỗi lời hứa phụ thuộc vào mỗi bước hoặc là trả lại lời hứa hoặc giá trị hoặc ném một lỗi.

Sau đây là viết lại mã của bạn. Lưu ý rằng

  • Mỗi callback trong đường dẫn trả về một cái gì đó và tất cả các chức năng trả về chuỗi lời hứa nó hoạt động với (thậm chí .auth(), nó có thể có ích tại một số điểm)
  • Tôi đã sử dụng BlueBird của .promisifyAll() để làm bcrypt chơi dọc theo
  • Tôi đã tách riêng .authenticate() khỏi cơ sở hạ tầng yêu cầu/phản hồi của bạn bằng cách làm cho các đối số usernamepassword rõ ràng. Bằng cách này, nó có thể được tái sử dụng dễ dàng hơn.

Vì vậy, bây giờ chúng tôi đã (không phải 100% thử nghiệm, tôi không bận tâm cài đặt đường nước):

module.exports = { 
    // authenticate the login request 
    auth: function (req, res) { 
     var params = req.allParams(); 
     return User.authenticate(params.username, params.password) 
     .then(function() { 
      res.send('Authenticated'); 
     }) 
     .fail(function (reason) { 
      res.send('Failed (' + reason + ')'); 
     }); 
    } 
}; 

var Promise = require("bluebird"); 
var bcrypt = Promise.promisifyAll(require('bcrypt')); 

module.exports = { 
    // check a username/password combination 
    authenticate: function (username, password) { 
     return User.findOne({ 
      username: username 
     }) 
     .then(function (user) { 
      return bcrypt.compareAsync(password, user.password) 
     }) 
     .catch(function (err) { 
      // catch any exception problem up to this point 
      console.log("Serious problem during authentication", err); 
      return false; 
     }) 
     .then(function (result) { 
      // turn `false` into an actual error and 
      // send a less revealing error message to the client 
      if (result === true) { 
       return true; 
      } else { 
       throw new Error("username or password do not match"); 
      } 
     }); 
    } 
}; 
+2

điều này sẽ xóa rất nhiều câu hỏi tôi có về lời hứa. +1 –

+2

Họ mất một số nhận được sử dụng để, nhưng sau đó họ là một công cụ đẹp. Tốt hơn theo mọi cách, so với kiến ​​trúc gọi lại gốc của nút. – Tomalak

+0

Nếu điều này cũng không trả lại lời hứa thay vì đúng/sai? Tôi cho rằng nếu không, không có gọi lại thực tế nào bạn có thể thực hiện trong Bộ điều khiển, hoặc ở đâu đó ở cấp http, do đó, đây sẽ là cuộc gọi đồng bộ. – mkbrv