【问题标题】:separate logic from view with route使用路由将逻辑与视图分开
【发布时间】:2015-07-24 17:06:04
【问题描述】:

我对 Node 很陌生,我正在使用 express。 我正在尝试实现简单的文件资源管理器。 说够了,这里有一些代码:

(本例的根目录是 /app。)

我的 app.js:

var express = require('express');
var fs = require('fs');
var path = require('path');
var ejs = require('ejs');
var app = express();
var server = require('http').createServer(app);
var io = require('socket.io').listen(server);

var explorer = require('./routes/explorer');

app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');

app.use("/public", express.static(__dirname + '/public'));
app.use('/', explorer);


server.listen(3000,function(){
    console.log('Server started on http://localhost:3000');
});

io.on('connection',function(client){
    console.log('connection with io established');
});

module.exports.app = app;
module.exports.server = server;

看到我已将“/”路由到资源管理器

和 explorer.js:

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

router.get('/', function(req, res, next) {
  res.render('explorer',{
    currentPath : currentPath
  });
});

function getUserHome() {
      var rawPath =  process.env[(process.platform == 'win32') ? 'USERPROFILE' : 'HOME'];
      return rawPath;
}

function clicked(){
    console.log(getUserHome());
}

视图 explorer.ejs:

<div class="clickable">clickme</div>
<script src="/socket.io/socket.io.js"></script>
<script>
var socket = io.connect('http://localhost:3000');
$('.clickable').click(function(){
    socket.emit('clicked');
});
</script>

基本上我想从视图中捕获“点击”发射并触发 explorer.js 中的点击函数。换句话说,我希望视图和 explorer.js 通过 socket.io 进行对话,因此视图可以与文件系统对话。 我尝试了几种方法并得到了一堆错误。

非常感谢!

【问题讨论】:

    标签: node.js model-view-controller express socket.io


    【解决方案1】:

    所以您已经在客户端触发了“点击”事件:

    // Client side :
    var socket = io.connect('http://localhost:3000');
    $('.clickable').click(function(){
        socket.emit('clicked');
    });
    

    现在,您必须在服务器端的 explorer.js 文件中捕获它:

    // Server side :
    // Instanciate your socket.io on the server side
    var io =  require('socket.io')(server)
    
    // Listen for a client connection :
    io.sockets.on('connection', function(socket){
        // Inside the connection, you can now declare each function for each event triggered on the client side
    
        socket.on('clicked', function() {
            //  This is your callback,
            //+ the code in this scope will be executed
            //+ only when the event 'clicked' is emitted
            cliked();
        });
    });
    

    【讨论】:

    • 感谢您的评论!我想在 explorer.js 上捕获它,并触发其中的函数function clicked(){ console.log(getUserHome()); }
    • 我编辑了我的答案,我忘记了连接事件。所以你必须要求'socket.io'模块并将它附加到你正在运行的服务器上。然后,你观察连接事件(由客户端自动触发),并为里面的每个事件声明你的行为。
    • 谢谢你,但当我将io.sockets.on('conectnion',function(socket){...}); 放入 app.js 时,它看起来仍然可以正常工作,但我只想为 explorer.js 分离这个逻辑,如果我有的话比如说 20 条路由,每条路由都有 20 个基于套接字数据的函数,它们都需要保存在 app.js 中吗?我不敢相信它是如此集中。
    • 我认为您可以在多个文件中声明它们,您将在 app.js 中为 io.sockets.on( .. ) 声明一个全局变量并在 explorer 中重用它.js.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-15
    • 2014-03-28
    • 2014-03-18
    • 2011-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多