我似乎在browser-sync
中使用的插座和我想用於socket.io
的插座有衝突。我通過gulp
任務(使用Aurelia CLI
默認項目)使用browser-sync
。會發生什麼是隻有browser-sync
套接字似乎工作,並且主要用於服務器端的socket.io
完全未讀。我確實找到了解決該問題的GitHub issue #71,以及這兩個都提到使用名稱空間的其他Github issue #241。然而,我嘗試了一些差異,即使它們運行有錯誤,但它不能解決我的任何問題。如何解決瀏覽器同步和socket.io衝突?
我主要使用Gulp
與browser-sync
的Aurelia CLI
項目中,而後端是NodeJS
與Koa
。的[email protected]
而[email protected]
使用的端口的版本是前端:4000,後端:5000
這裏的文件
咕嘟咕嘟的列表 - run.js
import gulp from 'gulp';
import browserSync from 'browser-sync';
import historyApiFallback from 'connect-history-api-fallback/lib';
import project from '../aurelia.json';
import build from './build';
import {CLIOptions} from 'aurelia-cli';
import url from 'url';
import proxy from 'proxy-middleware';
var portBackEnd = 5000;
var portFrontEnd = 4000;
var proxyOptionsAccessControl = function(req,res, next){
res.setHeader('Access-Control-Allow-Origin', '*');
next();
};
var proxyOptionsApiRoute = url.parse(`http://localhost:${portBackEnd}/api`);
proxyOptionsApiRoute.route = '/api';
var proxyOptionsAuthRoute = url.parse(`http://localhost:${portBackEnd}/auth`);
proxyOptionsAuthRoute.route = '/auth';
function log(message) {
console.log(message); //eslint-disable-line no-console
}
function onChange(path) {
log(`File Changed: ${path}`);
}
function reload(done) {
browserSync.reload();
done();
}
let serve = gulp.series(
build,
done => {
browserSync({
online: false,
open: false,
port: portFrontEnd,
notify: true,
logLevel: 'silent',
server: {
baseDir: ['.'],
middleware: [
proxyOptionsAccessControl,
proxy(proxyOptionsApiRoute),
proxy(proxyOptionsAuthRoute)
]
},
socket: {
domain: 'localhost:4000',
namespace: '/browsersync'
}
}, function(err, bs) {
let urls = bs.options.get('urls').toJS();
log(`Application Available At: ${urls.local}`);
log(`BrowserSync Available At: ${urls.ui}`);
done();
});
}
);
let refresh = gulp.series(
build,
reload
);
let watch = function() {
gulp.watch(project.transpiler.source, refresh).on('change', onChange);
gulp.watch(project.markupProcessor.source, refresh).on('change', onChange);
gulp.watch(project.cssProcessor.source, refresh).on('change', onChange);
};
let run;
if (CLIOptions.hasFlag('watch')) {
run = gulp.series(
serve,
watch
);
} else {
run = serve;
}
export default run;
使用具有Aurelia的Socket.io客戶端(前端)
import io from 'socket.io-client';
var socket = io('http://localhost:5000');
// also tried with a namespace instead
//var socket = io('/todo-socket');
// ...
socket.on("todo_update", data => {
let pos = arrayFindObjectIndex(this.items, 'id', data.id);
if(pos >= 0) {
this.items.splice(pos, 1, data);
this.itemDoneCount = this.items.filter(x => x.completed).length;
}
});
周用的NodeJS興亞(後端)
// Middlewares
const app = require('koa')();
const serve = require('koa-static');
const api = require('koa-router')();
const assertTimeout = require('co-assert-timeout');
const http = require('http');
const server = require('http').createServer(app.callback());
const io = require('socket.io')(server);
// or without namespace: io.sockets.on("connection", function(socket) {
var tsp = io.of('/todo-socket');
tsp.on("connection", function(socket) {
console.log('A new WebSocket client connected with ID: ' + socket.client.id);
})
.error(function(err){
console.log("Changefeeds Failure: ", err);
return null;
});
socket.on('disconnect', function(data) {
console.log('A WebSocket client disconnnected with ID: ' + socket.client.id);
return null;
});
我想有和沒有命名空間,這似乎並沒有改變任何東西。我提到browser-sync - socket option
編輯
從測試這個多,它實際上好像在服務器端socket.io
是不工作的。它不會從服務器輸出console.log('connected with ID: ' + socket.client.id)
,但它不會顯示或拋出任何錯誤。服務器端的代碼與WebPack
一起使用,所以我認爲它與browserSync
衝突有關。