是否可以有这样的模式 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()
中间件,用于通过将 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 /foo
, GET /bar/baz/qux
) 访问聊天。