2012-07-23 32 views
7

Tôi hiện đang cố gắng tạo mô-đun xác thực cho dự án của mình trong node.js?Chức năng bcrypt không đồng bộ hoặc đồng bộ hóa để sử dụng trong node.js để tạo băm?

Tôi đã nhìn thấy một số ví dụ của việc sử dụng bcrypt để tạo ra băm, ví dụ:

https://github.com/bnoguchi/mongoose-auth/blob/master/lib/modules/password/plugin.js https://github.com/Turbo87/locomotive-passport-boilerplate/blob/master/app/models/account.js

Tuy nhiên, vì một lý do họ đang sử dụng bcrypt.hashSync() chức năng. Kể từ bcrypt là tốt vì nó tốn nhiều thời gian, nó sẽ không được khôn ngoan để sử dụng chức năng đồng bộ thay vì để không chặn mã, tức là:

User.virtual('password') 
.get(function() { 
    return this.hash; 
}) 
.set(function (password) { 
    bcrypt.hash('password', 10, function(err, hash) { 
     this.hash = hash; 
    }); 
}); 

Ông có thể giải thích cho tôi đó là cách tốt hơn và tại sao? Cảm ơn bạn!

Trả lời

7

Có, bạn muốn sử dụng phiên bản async nếu có thể để bạn không bị ràng buộc trong quá trình xử lý nút của mình trong quá trình băm mật khẩu. Trong cả hai trường hợp mã nguồn bạn tham chiếu, mã đang sử dụng phiên bản đồng bộ vì phương thức được sử dụng trong đồng bộ nên tác giả không có lựa chọn nào ngoài việc sử dụng phiên bản đồng bộ.

+3

+1, async chắc chắn là lựa chọn đúng đắn; một điều cần lưu ý khi sử dụng ODM như Mongoose là getters và setters không thể không đồng bộ, vì vậy một số tác giả sẽ sử dụng các phương thức đồng bộ bên trong chúng thay thế. Đây thường là động thái sai; trong quá khứ, tôi đã sử dụng một phương thức tùy chỉnh trên mô hình như 'setPassword' để làm bộ mật khẩu async. –

+0

@BrandonTilley bạn có thể đưa ra ví dụ về phương pháp tùy chỉnh của mình không? –

+2

@lori Oh man, đã lâu rồi kể từ khi tôi đăng bài này, nhưng một cái gì đó như thế này có vẻ gần: https://gist.github.com/BinaryMuse/7983335 –