2017-11-08 5 views
1

빈에/내가 액세스하거나route/index에서 io.emit()에 액세스하는 방법? 명시 4.15

(내가 그나마 것이 가능 여부를 알아?) socket.io를 통해 난을 메시지 나 몽구스 결과를 보낼 필요가 여기

var server = http.createServer(app); 
io = require('socket.io')(server); 
io.on('connection', function(client) { 
console.log('Client connected...'); 
client.on('join', function(data) { 
    console.log(data); 
}); 
}); 

server.listen(port); 

을 www.js routes/index.js 페이지에서 클라이언트에게 메시지를 보내야합니다. 내가이 뭘하려 ,

module.exports.io = io; //(in `bin/www`) 

과는 = 필요한 입출력이 VAR ('../ 빈/www가')처럼하는 index.js에 타이어 IO에 액세스;

io.on('connection', function(client) { 
console.log('Client connected...'); 
client.on('join', function(data) { 
    console.log(data); 
}); 
}); 

하지만

io.on('connection', function(client) { 
^ 
TypeError: io.on is not a function.... 

내 필요가 일부 오류, 나는 경로가 전화를받을 때 클라이언트에 동적 결과를 보내거나 socket.io을입니다 사용하여 클라이언트에 일부 mongoose 쿼리 결과를 보낼 를 슬로우하는 가능한거야? 4.15 급행 var server = http.createServer(app);

은/빈에

갱신

PATHC:\Users\ADSS\Desktop\PrintAdmin\public 

C 인 Ashish

에 의해 주어진 코드 뒤에

var express = require('express'); 
var path = require('path'); 
var favicon = require('serve-favicon'); 
var logger = require('morgan'); 
var cookieParser = require('cookie-parser'); 
var bodyParser = require('body-parser'); 

var index = require('./routes/index'); 
var users = require('./routes/users'); 

var app = express(); 

    // view engine setup 
app.set('views', path.join(__dirname, 'views')); 
app.set('view engine', 'jade'); 

// uncomment after placing your favicon in /public 
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico'))); 
app.use(logger('dev')); 
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({ extended: false })); 
app.use(cookieParser()); 

/*app.use(function(req, res, next) { 
req.headers['if-none-match'] = 'no-match-for-this'; 
next(); 
});*/ 



//app.use(express.static(path.join(__dirname, 'public'))); 
app.use(express.static(path.join(__dirname, 'public'), { 
maxAge: '30d', 
setHeaders: function (res, path) { 
     res.setHeader('Cache-Control', 'public, max-age=14770') 
} 
})); 

console.log("PATH"+path.join(__dirname, 'public')); 

app.io = require('socket.io')(); 
app.io.on('connection', function(socket){ 
// do whatever you want 
}); 

const userRoute = require('./routes/index')(app.io); 
app.use('/', userRoute); 
app.use('/users', users); 

// catch 404 and forward to error handler 
app.use(function(req, res, next) { 
    var err = new Error('Not Found'); 
    err.status = 404; 
    next(err); 
    }); 

// error handler 
app.use(function(err, req, res, next) { 
    // set locals, only providing error in development 
    res.locals.message = err.message; 
    res.locals.error = req.app.get('env') === 'development' ? err : {}; 

    // render the error page 
    res.status(err.status || 500); 
    res.render('error'); 
}); 


module.exports = app; 

오류 app.js www.js : \ Users \ ADSS \ Desktop \ PrintAdmin \ node_modules \ express \ lib \ router \ index.js : 635 return fn.apply (this, arguments); ^

TypeError: Cannot read property 'apply' of undefined 
at 

C : \ 사용자 \ ADSS \ 바탕 화면 \ PrintAdmin \ node_modules \ 표현 \ lib 디렉토리 \ 라우터 \하는 index.js : 635 : 14 다음 (C에서 : \ 사용자 \ ADSS \ 바탕 화면 \ PrintAdmin \ Function.handle에있는 (C : \ Users \ ADSS \ Desktop \ PrintAdmin \ node_modules \ express \ lib \ router \ index.js : 174 : 3) 에서 node_modules \ express \ lib \ router \ index.js :210 : 라우터에서 (C : \ Users \ ADSS \ Desktop \ PrintAdmin \ node_modules \ express \ lib \ router \ index.js : 47 : 12) at 개체. (Module.js : 579)에서 (Module.js : 579 : C : \ Users \ ADSS \ : Module.require의 에서 Module.load (module.js : 487 : 32) 을 tryModuleLoad (module.js : 446 : 12) Function.Module._load (module.js : 438 : 3) (module.js : 497 : 17) at require (internal/module.js : 20 : 19) at Object. (Module.js : 570 : 32) (Object.Module._extensions..js (module.js : 579)에서 에 C : \ Users \ ADSS \ Desktop \ PrintAdmin \ bin \ www : : 10) at Module.load (module.js : 487 : 32)

+0

계십니다의 user.js 형제 .. 나는 그것을 www.js에있는 app.js에 서버를 만들고 있지 않다 – AnonymousObject

답변

5

나는 IO 객체를 사용하는 순환 종속성 문제가있다, 당신은 app.js 및 빈/www가 파일을 생성 명시 생성기를 사용하여 응용 프로그램을 생성 한 생각 내부 경로. 여기에 당신이 할 수있는 무엇,

내부는 app.js 빈/www가 내부

app.io = require('socket.io')(); // initialize io, attach server in www 
// use socket events here 
app.io.on('connection', function(socket){ 
    // do whatever you want 
}) 

// you can pass app.io inside the router and emit messages inside route. 
const userRoute = require('./routes/user')(app.io); 
app.use('/users', userRoute); 

var io = app.io; 
var server = http.createServer(app); 
io.attach(server); 

이제 여기에 라우터가 보이는 방법은, 아니

module.exports = function(io){ 
    router.get('/', function(req, res, next){ 
     io.emit("message", "your message"); 
     res.send(); 
    }) 
    // edited 
    return router; 
} 
+0

이것이 최선의 방법입니다. :) –

+0

return fn.apply (this, arguments); ^ TypeError : 정의되지 않은 .... at Object의 'apply'속성을 읽을 수 없습니다. (C : \ Users \ ADSS \ Desktop \ PrintAdmin \ app.js : 45 : 44) 오류 !!! – AnonymousObject

+0

app.js 파일을 공유하여 실행하고 볼 수 있습니까? –

0

참고 : 실제적으로 아직 시도하지 않았습니다.

하지만이 패턴을 대신 사용해 볼 수 있습니까?

www.하는 index.js에서 JS

module.exports = function(io) { 

    io.on('connection', function(client) { 
    console.log('Client connected...'); 
    client.on('join', function(data) { 
     console.log(data); 
    }); 
    }); 
} 

var server = http.createServer(app); 
io = require('socket.io')(server); 

require('./wwww.js)(io); 
+0

동생 var 서버 = http.createServer (응용 프로그램); io = require ('socket.io') (서버); www.js에 정의되어 있다면 index.js에서 어떻게 정의 할 수 있습니까? – AnonymousObject

+0

당신은 몰라요. 요구 사항을 복사 - 붙여 넣기의 한 형태로 생각하십시오. 이 경우; www.js 내부의 모듈 .exports는 이제 index.js 안에 붙여 넣어집니다. –