javascript - Node.js 解析路由的最小函数

标签 javascript regex node.js routes socket.io

我有一个 Node.js/Express 应用在工作,它接收这样的路由:

app.get('/resource/:res', someFunction);
app.get('/foo/bar/:id', someOtherFunction);

这很棒而且工作正常。

我也在使用 Socket.IO,并希望一些服务器调用使用 websockets 而不是传统的 RESTful 调用。但是,我想让它非常干净并且几乎使用相同的语法,最好是:

app.sio.get('/resource/:res', someFunction);

这将为 Socket.IO 提供一个合成的“REST”接口(interface),从程序员的 Angular 来看,他并没有做任何不同的事情。只需从客户端标记 websockets: true

我可以处理所有细节,例如传入请求动词并解析它们的自定义方式等等,我对此没有问题。我唯一要找的是一些可以像 express 一样解析路由并正确路由它们的函数。例如,

// I don't know how to read the ':bar',
'foo/:bar'

// Or handle all complex routings, such as
'foo/:bar/and/:so/on'

我可以深入挖掘并尝试自己编写代码,或者尝试通读所有 express 的源代码并找到他们在哪里做的,但我确信它本身就存在。只是不知道在哪里可以找到它。

更新

robertklep 提供了一个很好的答案,为我完全解决了这个问题。我将其改编成一个完整的解决方案,并将其发布在下面的答案中。

最佳答案

您可以使用 Express 路由器类来完成繁重的工作:

var io        = require('socket.io').listen(...);
var express   = require('express');
var sioRouter = new express.Router();

sioRouter.get('/foo/:bar', function(socket, params) {
  socket.emit('response', 'hello from /foo/' + params.bar);
});

io.sockets.on('connection', function(socket) {

  socket.on('GET', function(url) {
    // see if sioRouter has a route for this url:
    var route = sioRouter.match('GET', url);
    // if so, call its (first) callback (the route handler):
    if (route && route.callbacks.length) {
      route.callbacks[0](socket, route.params);
    }
  });

});

// client-side
var socket = io.connect();
socket.emit('GET', '/foo/helloworld');

您显然可以在请求中传递额外数据,并将其传递给您的路由处理程序(例如作为额外参数)。

关于javascript - Node.js 解析路由的最小函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19468110/

相关文章:

IE11 的 Javascript 问题

javascript - HTML5 可拖动图像 "selecting"并在 Firefox 中搞砸了我的拖动 JavaScript

regex - 尝试在 Perl 中匹配两个都包含特殊字符的变量

javascript - 正则表达式匹配括号之间的 Javascript 函数中的参数

javascript - 部署后套接字io不工作

javascript - 从指令调用时未定义Typescript Angularjs Controller 范围

javascript - 如何在 JavaScript 中处理任意数量的参数时柯里化(Currying)?

python - 正则表达式匹配单词,但仅当它不以非字母数字字符开头时

javascript - Node.js 无法检测到 Get 方法

node.js - 如何将标记区域转换为 PostgreSQL 查询?