13

総node.js初心者が、さまざまなチュートリアルやWebサイトのデモコードで遊んでいると、理解できないことに気づきました...

つまり、 /public フォルダーに index.html がある場合、

app.get("/", function (req, res) {
    console.log("get /");
    res.redirect("/test.html");
});

単に呼び出されることはありません。index.html の名前を index2.html に変更するとすぐに、メソッドが呼び出され、/public/test.html にリダイレクトされます。

これは私が持っているものです:

var io = require('socket.io'),
    express = require('express'),
    MemoryStore = express.session.MemoryStore,
    app = express.createServer(),
    sessionStore = new MemoryStore();

app.configure(function () {
    app.use(express.bodyParser());
    app.use(express.cookieParser());
    app.use(express.session({
        store: sessionStore,
        secret: 'secret',
        key: 'express.sid'
    }));
    app.use(express.static(__dirname + '/public'));
});

残りはこのチュートリアルからほとんど取られています: http://www.danielbaulig.de/socket-ioexpress/

他のファイルでも同じ問題が発生します。/public/test.html がある場合、呼び出したときに

http://localhost:8201/test.html

この app.get は呼び出されません:

app.get("/test.html", app.authenticateUser, function (req, res) {
    console.log("get /test.html");
    res.redirect("/test2.html");
});

test.html を削除すると、test2.html に転送されます...

私がリダイレクトしようとしている理由は、ユーザーがログインしていない場合、ユーザーに index.html を開かせたくないのですが、index.html が存在する場合は不可能な login.html に転送したいからです。唯一の「解決策」は、それをクライアント側で実行することです。これはひどいものです。index.htmlをクライアントのブラウザにロードして、彼をlogin.htmlに転送したくありません。私の意見では、サーバーはそれを処理する必要があります。

4

5 に答える 5

23

問題は、静的ファイルのミドルウェアapp.use(express.static(__dirname + '/public'))がルーターの「前」にあることです。あなたが書くとき

app.configure(function () {
app.use(express.bodyParser());
app.use(express.cookieParser());
app.use(express.session({
    store: sessionStore,
    secret: 'secret',
    key: 'express.sid'
}));
app.use(express.static(__dirname + '/public'));
});

これはと同等です

app.configure(function () {
app.use(express.bodyParser());
app.use(express.cookieParser());
app.use(express.session({
    store: sessionStore,
    secret: 'secret',
    key: 'express.sid'
}));
app.use(express.static(__dirname + '/public'));
app.use(app.router); //Express implicitly appends router middleware!
});

明示的にどこかに追加しないと、Express はルーターミドルウェアをスタックの最後に暗黙的に追加するためです。これで、静的ファイル ミドルウェアがルーターの前にあることがはっきりとわかります。静的ファイルが見つかった場合、それはによって処理されapp.use(express.static(__dirname + '/public'))、ルーターapp.use(app.router)は呼び出されません。リクエストが常にルーターを通過するようにしたい場合は、前に置く必要があります。たとえば、

app.configure(function () {
app.use(express.bodyParser());
app.use(express.cookieParser());
app.use(express.session({
    store: sessionStore,
    secret: 'secret',
    key: 'express.sid'
}));
app.use(app.router); //Now router comes first and will be executed before static middleware
app.use(express.static(__dirname + '/public'));
});
于 2012-05-18T00:46:44.050 に答える
2

これは、エクスプレスがコードに到達する前にリクエストをフィルタリングするためです。ファイルを見つけてブラウザに返します。

解決策は、socket.io を介してイベントを送信し、ユーザーのブラウザのコードに、ファイルをプライベート スペース (パブリック ディレクトリの外) にリダイレクトまたは移動するように指示し、CydGy が提案したように「fs」を介して提供することです。

于 2012-05-17T21:14:09.220 に答える
0

この非常に優れたチュートリアル (http://www.danielbaulig.de/socket-ioexpress/) では、ソケットを扱っています。そして、この場合には役に立たないと思います。

だから、これを見てください:

app.get("/test.html", app.authenticateUser, function (req, res) {

しかし、どこapp.authenticateUserですか?ブロックするのは確かに彼です

したがって、次のように置き換えます。

app.get("/test.html", function (req, res) {

またはあなたのを変更しますapp.authenticateUser

(そして、モジュールfsを使用してファイルを読み取ると、次のことができますres.send(file);

URL に .html を書き込むことを忘れないで"/test.html"ください"/test"

お役に立てば幸いです。

于 2012-05-17T20:26:24.330 に答える
-3

app.get("/", 関数 (req, res)...

これを試して

app.get('/', 関数 (req, res)...

URI パスは ' 一重引用符で囲む必要があります。

于 2020-10-07T06:37:37.777 に答える