2015-03-29 15 views
9

Tôi đang cố tạo một API nút thực sự đơn giản bằng cách sử dụng express.js 4 nhưng tôi cần một vài sự kiện 'thời gian thực' mà tôi đã thêm socket.io. Tôi khá mới cho cả hai vì vậy tôi có thể thiếu một cái gì đó cơ bản nhưng tôi không thể tìm thấy tài liệu tốt/tuts về điều này.express.js 4 và ổ cắm với bộ định tuyến nhanh

Trong ứng dụng nhanh (được tạo bằng trình tạo tốc độ nhanh), tôi có một cái gì đó như thế này dựa trên các ví dụ đơn giản và tài liệu dự án mà tôi đã đọc. Này hoạt động OK và từ các ứng dụng khách hàng, tôi có thể gửi/nhận các sự kiện ổ cắm:

var express = require('express'); 
var path = require('path'); 
var logger = require('morgan'); 
var api = require('./routes/api'); 
var app = express(); 
var io = require('socket.io').listen(app.listen(3000)); 

app.use(logger('dev')); 
app.use(express.static(path.join(__dirname, 'public'))); 
app.use('/api', api); 

io.sockets.on('connection', function (socket) { 
    console.log('client connect'); 
    socket.on('echo', function (data) { 
     io.sockets.emit('message', data); 
    }); 
}); 


// error handlers omitted 

module.exports = app; 

nhưng tôi muốn sử dụng ổ cắm từ đường API của tôi (trong file ./routes/api.js mà tôi yêu cầu ' ở trên). Ví dụ, ai đó có thể sử dụng API để PUT/POST một tài nguyên và tôi muốn phát sóng đó cho các máy khách socket.io được kết nối.

Tôi không thể xem cách sử dụng biến 'io' hoặc sắp xếp mã hiện tại trong hàm io.sockets.on('connection' ... bên trong các tuyến đường tốc hành. Đây là tệp ./routes/api.js:

var express = require('express'); 
var router = express.Router(); 
var io = ???; 

router.put('/foo', function(req, res) { 
    /* 
     do stuff to update the foo resource 
     ... 
    */ 

    // now broadcast the updated foo.. 
    io.sockets.emit('update', foo); // how? 
}); 

module.exports = router; 

Trả lời

8

Tôi đã sửa đổi tệp của bạn một chút, bạn có thể kiểm tra xem tệp có hoạt động không?

Bạn có thể chuyển io mà bạn đã xác định cho các tuyến đường của mình như dưới đây;

require('./routes/api')(app,io); 

tôi đã không kiểm tra những phần Socket.IO nhưng không có lỗi cú pháp và các tuyến đường cũng làm việc.

server.js file:

var express = require('express'); 
var app = express(); 
var path = require('path'); 
var logger = require('morgan'); 

var io = require('socket.io').listen(app.listen(3000)); 

app.use(logger('dev')); 
app.use(express.static(path.join(__dirname, 'public'))); 

io.sockets.on('connection', function (socket) { 
    console.log('client connect'); 
    socket.on('echo', function (data) { 
    io.sockets.emit('message', data); 
}); 
}); 

require('./routes/api')(app,io); 

console.log("Server listening at port 3000"); 

api.js:

module.exports = function(app,io) { 
app.put('/foo', function(req, res) { 

    /* 

     do stuff to update the foo resource 

     ... 

    */ 


    // now broadcast the updated foo.. 

    console.log("PUT OK!"); 

    io.sockets.emit('update'); // how? 
    res.json({result: "update sent over IO"}); 

}); 
} 
+1

Cảm ơn Caner. Điều đó hoạt động và với một vài chỉnh nhỏ tôi có thể sử dụng vì ứng dụng cụ thể này khá đơn giản. Nhưng khi tôi đang cố gắng sử dụng nó để tìm hiểu một số phương pháp hay nhất, có cách nào để tiếp tục sử dụng Bộ định tuyến nhanh() không? Điều đó có vẻ là cách thành ngữ để diễn đạt 4.x. – darrend

+0

@darrend, theo tài liệu express.js có vẻ như không sao nếu sử dụng như vậy http://expressjs.com/api.html, bạn nghĩ sao? – cdagli

+0

Điều đó là hợp lý - Tôi sẽ đánh dấu là được chấp nhận và đào sâu vào tài liệu và mã một số chi tiết. Cảm ơn đã giúp đỡ. – darrend

14

Một lựa chọn là để vượt qua nó để đối tượng req.

app.js:

var express = require('express'); 
var path = require('path'); 
var logger = require('morgan'); 
var api = require('./routes/api'); 
var app = express(); 
var io = require('socket.io').listen(app.listen(3000)); 

app.use(logger('dev')); 
app.use(express.static(path.join(__dirname, 'public'))); 

io.sockets.on('connection', function (socket) { 
    console.log('client connect'); 
    socket.on('echo', function (data) { 
     io.sockets.emit('message', data); 
    }); 
}); 

// Make io accessible to our router 
app.use(function(req,res,next){ 
    req.io = io; 
    next(); 
}); 

app.use('/api', api); 

// error handlers omitted 

module.exports = app; 

./routes/api.js:

var express = require('express'); 
var router = express.Router(); 

router.put('/foo', function(req, res) { 
    /* 
     do stuff to update the foo resource 
     ... 
    */ 

    // now broadcast the updated foo.. 
    req.io.sockets.emit('update', foo); 
}); 

module.exports = router; 
+0

bạn đã thực sự nhận được mã trên để làm việc? io theo yêu cầu của tôi tiếp tục hiển thị dưới dạng không xác định trong mã bộ định tuyến của tôi – atsituab

+0

Tôi đã nhầm lẫn ở đó - phần '// Làm cho io có thể truy cập vào bộ định tuyến của chúng tôi 'phải được xác định trước' app.use ('/api ', api); ' – platlas

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