2015-06-01 14 views
10

Tôi muốn phát ra sự kiện khi blog mới lưuLàm thế nào để phát ra sự kiện trong middleware mongoose?

blog.post('save',function(blog){ 
    this.emit('newBlog',blog) 
}) 

và ở một nơi khác trong dự án của tôi nói app.js có thể nghe sự kiện này

EventEmitter = require('events').EventEmitter; 
emitter = new EventEmitter(); 

emitter.on('newBlog',function(blog){ 
    console.log(blog); 
}) 

làm thế nào để làm điều này?

Trả lời

9

Cách trình phát sự kiện hoạt động là bạn phải sử dụng đối tượng phát hiện sự kiện cùng để nghe trên đó bạn đã sử dụng để phát ra. Vì vậy, bạn cần một cái gì đó như thế này:

Để chia sẻ điều này giữa các phần khác nhau của dự án, bạn nên tạo một mô-đun ra khỏi nó và yêu cầu nó ở bất cứ nơi nào cần thiết.

my-event.js:

var eventEmitter = new require('events').EventEmitter(); 
module.exports = eventEmitter; 

Sau đó, bạn require này eventEmitter bất cứ nơi nào bạn muốn sử dụng nó

blog.js:

var myEvent = require('../my-event'); 
blog.post('save',function(blog){ 
    myEvent.emit('newBlog', blog); 
}); 

app.js:

var myEvent = require('./my-event'); 
myEvent.on('newBlog', console.log); 

Nếu bạn không muốn phải trải qua những rắc rối của việc tạo ra và đòi hỏi phải có mô-đun riêng bạn, bạn có thể sử dụng toàn cầu process đó cũng là một EventEmitter.

anywhere:

process.on('my-custom-event', myCustomHandler); 

anywhere-else:

process.emit('my-custom-event', data); 

Mặc dù một cảnh báo công bằng: bạn đang làm ô nhiễm phạm vi toàn cầu. Nếu một số mô-đun khác cũng làm như vậy và sử dụng cùng tên sự kiện thì bạn có một xung đột có thể xuất hiện theo cách bất ngờ và thậm chí còn khó khăn hơn để gỡ lỗi.

+0

Tôi nghĩ kế thừa schema mongoose từ EventEmitter, vì vậy tôi chỉ có thể làm 'this.emit (' newBlog ', blog) 'thay vì' eventEmitter.emit (' newBlog ', blog); ', nhưng trình xử lý sự kiện sẽ không hoạt động.và tôi nghĩ rằng nếu tôi phải vượt qua cùng một bộ phát sinh sự kiện bất cứ khi nào tôi cần sử dụng nó, thì điểm là gì? Tôi chỉ có thể thay thế sự kiện bằng logic kinh doanh thực tế để tiết kiệm cho tôi một loạt rắc rối. – paynestrike

+1

@paynestrike Điểm chính là tách. Nó có nghĩa là thứ phát ra không phải biết về tất cả những thứ đang lắng nghe. –

+0

@AaronDufour thì làm cách nào tôi có thể chuyển eventEmitter trong mô hình của mình sang app.js? – paynestrike

2

Nếu bạn phát ra sự kiện của mình từ một tài liệu (một thể hiện của một lược đồ cụ thể), thì bạn phải lắng nghe trên cá thể này để nhận sự kiện.

Nếu bạn muốn nghe toàn cầu trên tất cả các sự kiện được tạo bởi tất cả các trường hợp thì bạn phải phát ra sự kiện từ Giản đồ.

blog.post('save',function(blog){ 
    blog.schema.emit('newBlog',blog) 
}) 

Và trong app.js của bạn ví dụ, bạn có thể nghe cho các sự kiện trên giản đồ:

Blog.schema.on('newBlog',function(blog){ 
    console.log(blog); 
}) 
+0

Bạn có thử phương pháp của bạn, tôi đã làm và nó không working.'this.schema' là undefined. – paynestrike

+0

Xin lỗi, tôi đã không thử nghiệm với các móc bài nhưng tôi biết nó hoạt động nếu bạn có một thể hiện của tài liệu. Vì vậy, bạn chỉ có thể thay thế this.schema bằng blog.schema. Nó sẽ hoạt động –

+0

@paynestrike, bạn đã thành công trong việc thực hiện công việc thông báo chưa? –

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