次のようなパターン URL を持つことは可能ですか。
ええ、エクスプレスはあなたがリストしたルートを正確にサポートしています。ドキュメントでは、これを「名前のないワイルドカード」と呼んでいます。
// GET /foo -> (200) "foo"
// GET /baz/qux -> (200) "baz/qux"
app.get('/*', function (req, res) {
res.send(req.params[0]);
});
ただし、あなたの例では、Express/Connect には、ベース ディレクトリへの URL パスを組み合わせてファイルを提供するためのstatic()
ミドルウェアが含まれています。
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
) からチャットにアクセスできます。