1

基本的な Expressjs アプリ (jade を使用) がありますが、基本的な Jade ファイルのレンダリングに問題があります。リクエストを受け取ったら、URL のパス名を解析し、ハンドル オブジェクトを使用して次のようにリクエストをルーティングします。

index.js

var requestHandlers = require('./requestHandlers');

var handle = {};
handle['/'] = requestHandlers.start;
handle['/download'] = requestHandlers.download

requestHandlers.js

   function start(res) {
        console.log("request handler for start called");
        res.render('home', {title: 'express'});
    }

    function download(res) {
        res.render('download', {title: 'download'})
        res.end();
    }

    exports.start = start;
    exports.download = download;

ホーム.ジェイド

h1= title
p Welcome to #{title}

テンプレートエンジンとして Jade を使用しており、別の server.js ファイルでサーバーを構成しています。いずれかのページをリクエストすると、ブラウザのタブにタイトルが正しく表示されますが、ページは表示されず、ロードし続けます。奇妙なことに、リクエストをキャンセルするとページが表示されます。すべてが機能しているように見えますが、プロセスを終了するように指示するものは何もありませんか?

私はノードに比較的慣れていないので、上記のいずれかについて私の素朴さを許してください。解決できる質問があれば教えてください。

4

1 に答える 1

3

ブラウザのタイムアウトを防ぐために、必要に応じてコードが TCP 接続を強制終了しない理由を 100% 確信しているわけではありませんが、問題を解決し、コードの読みやすさ、保守性を維持する Express 規則に適したソリューションを提供できます。 、および分離。

./app.js (メイン サーバー スクリプト)

var express = require('express'),
    app = express.createServer(),
    routes = require('./routes');

app.configure(function () {

    // Render .jade files found in the ./views folder
    // I believe you are already doing this
    app.set('views', __dirname + '/views');
    app.set('view engine', 'jade');

    // Use the built-in Express router
    // This kills the "handle" method you had implemented
    app.use(app.router);

    // Client-side assets will be served from a separate ./public folder
    //     i.e. http://yourhost.com/js/main.js will link to ./public/js/main.js
    app.use(express.static(__dirname + '/public'));

});

// Initialize routes
routes.init(app);

./routes/index.js

exports.init = function (app) {

    app.get('/', function (req, res) {
        console.log("request handler for start called");

        // Render __dirname/views/home.jade
        res.render('home', {title: 'express'});
    });

    app.get('/download', function (req, res) {
        // Render __dirname/views/download.jade
        res.render('download', {title: 'download'})
    });

});

上記により、URL パラメータを自分で解析する必要がなくなります。また、より読みやすく強力なリクエスト ハンドラーを定義することもできます (POST メソッドの app.post など)。REST API を構築することにした場合、Express-Resource モジュールなどをより簡単に結び付けることができるようになりました。

より強力なマッピングが必要な場合は、app.[get/post/put/del] の最初のパラメーターで正規表現を使用して、代わりに特定のパスをフィルター処理できます。

于 2012-06-16T19:30:05.930 に答える