2017-08-21 29 views
0

出於好奇,我選擇了Koa2作爲我的家庭節點服務器。不幸的是,我陷入了實現客戶端/服務器通信的websockets。在以下應用程序中,socket.io客戶端拒絕連接到其服務器部分。任何想法/提示?Koa-mount/router + socket.io集成

// main.js 
const argv = require('yargs'); 
const app = require('./src/app'); 
const conf = require('./config'); 

const port = argv.port || process.env.PORT || conf.port || 3000; 

app.listen(port); 

console.log(`IOKvit Server is listening on port ${ port }...`); 

.....................

// app.js 
const Koa = require('koa'); 
const mount = require('koa-mount'); 
const router = require('./api'); 
const staticRoutes = require('./static'); 

const app = new Koa(); 

app.use(mount(staticRoutes)); 
app.use(router.routes()); 
app.use(router.allowedMethods()); 

const http = require('http'); 
const socket = require('socket.io'); 

const server = http.createServer(app.callback()); 
const io = new socket(server); 

io.on('connection', function(socket){ 
    console.log('a user connected') 
}); 

module.exports = app; 

............... ......

// static.js 
const Koa = require('koa'); 
const serve = require('koa-static'); 
const mount = require('koa-mount'); 
const path = require('path'); 

const staticApp = new Koa(); 
const root_dir = path.dirname(require.main.filename); 

staticApp.use(serve(root_dir + '/static', { maxage: 60 * 1000 })); 
staticApp.use(mount('/lib/vue', serve(root_dir + '/node_modules/vue/dist/', { maxage: 60 * 1000 }))); 
staticApp.use(mount('/lib/vue-material', serve(root_dir + '/node_modules/vue-material/dist/', { maxage: 60 * 1000 }))); 
staticApp.use(mount('/lib/vue-router', serve(root_dir + '/node_modules/vue-router/dist/', { maxage: 60 * 1000 }))); 
staticApp.use(mount('/lib/socket.io', serve(root_dir + '/node_modules/socket.io-client/dist/', { maxage: 60 * 1000 }))); 
staticApp.use(mount('/lib/roboto', serve(root_dir + '/node_modules/roboto-fontface/css/roboto/', { maxage: 60 * 1000 }))); 
staticApp.use(mount('/lib/material-icons-font', serve(root_dir + '/node_modules/material-icons-font/', { maxage: 60 * 1000 }))); 

module.exports = staticApp; 

.....................

// api.js 
const Router = require('koa-router'); 
const house = require('./house').controller; 

const router = new Router(); 

router.get('/rooms', house.list_rooms); 
router.get('/rooms/:name', house.room); 

module.exports = router; 
+0

你能簡化一下嗎?例如,是否需要靜態位?你正在提供靜態資源嗎?中間件是否經過這一點? – akaphenom

+0

@akaphenom所有靜態資源似乎交付沒有問題。首先,我想使用nginx來託管靜態部分,但是它似乎並沒有通過套接字來傳遞。是的,我已經嘗試在nginx的配置中設置socket傳遞所需的值。 –

+0

我不會使服務器複雜化,直到你有基本的工作(不要引入nginx)。老實說,我沒有看到任何明顯的錯誤。我假設你沒有獲得套接字連接上的控制檯日誌消息? – akaphenom

回答

1

我在興亞利用這樣的代碼( 1.0.0):

const koa = require("koa"); 
const socketIo = require("socket.io"); 

const app = koa(); 
const port = 8000 
const http = app.listen(port); 
const io = socketIo.listen(http); 

io.on("connection", function(socket){ 
    console.log("connected") 
})