【问题标题】:Define pattern route for node js为节点js定义模式路由
【发布时间】:2013-10-10 16:38:51
【问题描述】:

我正在使用Node.js 和 express 来制作一个网络聊天应用程序。我有一个关于路由的问题。

我的路线是:

app.get("/", function( req, res ) {
    res.sendfile( __dirname + "/index.html" );
});

据我所知,这意味着所有客户都应该去http://www.example.com/index.html 页面访问聊天。 (也许,不确定)

是否可以有这样的模式网址:

app.get("/*", function( req, res ) {
    res.sendfile( __dirname + "/*" );
});

这样任何用户都可以访问任何 URL 上的聊天
简而言之: 类似于 facebook 聊天。可在所有页面中访问。

提前致谢

【问题讨论】:

  • 例如:app.use(express.static(__dirname));。但是,我认为您误解了 Facebook 的聊天功能。您需要研究像AjaxWebSockets 这样的客户端通信。而且,可以从您选择为其实现它们的任何页面使用它们。
  • 对于在 Node.js 中使用 WebSockets 等,您可以尝试socket.ioExample.
  • 我正在使用 socket.io,但只是我在路由它时遇到了问题。我的聊天应用程序几乎完成了。但它只能在 /index.html 中访问。因为我的路线。
  • 那是因为你没有路由它。 Socket.IO 创建额外的后台/异步连接到服务器,它独立于任何 Express 路由(通过 socket.on()socket.emit())管理。每个打算使用 Socket.IO 的“page”都需要包含socket.io.js 并调用io.connect()
  • 你问了 2 个不同的问题,我认为没有完全意识到这一点 -- 1) “如何创建通配符路由?” 2) “如何建立每个页面的实时通信?”下面的答案将对第一个有所帮助。但是,它不会直接建立第二个。它们将是整个应用程序的独立部分。

标签: javascript node.js routes


【解决方案1】:

是否可以有这样的模式 URL:

是的,Express 完全支持您列出的路线。文档将其称为“未命名的通配符。”

// GET /foo     -> (200) "foo"
// GET /baz/qux -> (200) "baz/qux"

app.get('/*', function (req, res) {
    res.send(req.params[0]);
});

不过,对于您的示例,Express/Connect 包含一个 static() middleware,用于通过将 URL 路径组合到基本目录来提供文件:

app.use(express.static(__dirname));

类似于 facebook 聊天。可在所有页面中访问。

这不一定与路由有很大关系。您的应用程序可能需要一个路由来收集联系人列表或其他持久数据,但实际的“聊天”将单独管理。

一般来说,这取决于在每个页面中包含公共内容——如果您使用视图/模板,可能通过“布局”或“继承” -- 显示输入消息的表格和显示聊天记录的区域。此外,相当多的聊天“工作”必须在客户端完成。

一个简单的例子是为多个 URL 提供同一个文件:

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

app.get('/*', function (req, res) {
    res.sendfile(__dirname + '/chat.html');
});

var chat = io
    .of('/chat') // namespace
    .on('connection', function (socket) {
        socket.on('message', function (data) {
            chat.emit('message', data);
        });
    });

server.listen(3000);

并且,在那个文件中:

<div id="chat-log"></div>
<form id="chat-send">
    <input name="message">
    <input type="submit" value="Send">
</form>

<script src="/socket.io/socket.io.js"></script>
<script>
    var chatForm = document.getElementById('chat-send');
    var chatLog = document.getElementById('chat-log');

    var chatSocket = io.connect('/chat');

    chatSocket.on('message', function (data) {
        chatLog
            .appendChild(document.createElement('div'))
            .appendChild(document.createTextNode(data.text));
    });

    chatForm.onsubmit = function () {
        chatSocket.emit('message', {
            text: chatForm.message.value
        });

        chatForm.message.value = '';
        chatForm.message.focus();
        return false;
    };
</script>

然后,您可以从任何地址(GET /GET /fooGET /bar/baz/qux)访问聊天。

【讨论】:

  • 非常感谢您的回复。我已经在客户端和服务器端进行了与 facebook 完全一样的聊天。但我的问题是在所有 URL 中访问它。我将为此使用 PHP Laravel。它支持布局,并且所有 URL 首先引用 index.php 然后渲染。我想知道我是否定义了一个 /index.php 它将在我使用 laravel 开发我的网站时在我的所有页面中工作......!
【解决方案2】:

您可能会想要使用这样的 url 参数:

app.get("/:chatter",function(req,res){
    console.log("the chatter is",req.param('chatter'));
    res.sendfile( __dirname + "/index.html" );
    ...
});

【讨论】:

    猜你喜欢
    • 2016-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多