在expressjs中渲染玉器文件

时间:2012-06-08 20:23:48

标签: javascript node.js

我有一个基本的expressjs应用程序(使用jade),但我在渲染基本的Jade文件时遇到问题。当我收到请求时,我解析路径名的url并使用handle对象来路由请求,如下所示:

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;

home.jade

h1= title
p Welcome to #{title}

我使用Jade作为我的模板引擎,并将服务器配置在单独的server.js文件中。当我请求其中一个页面时,标题在我的浏览器选项卡上正确显示,但页面不显示,它只是继续加载。奇怪的是,当我取消请求页面显示时。就好像一切正​​常但没有任何东西告诉过程结束?

我对节点相对较新,请原谅我对上述任何一点的天真。如果有任何问题我可以澄清,请告诉我。

1 个答案:

答案 0 :(得分:3)

我不是100%肯定为什么你的代码没有根据需要杀死TCP连接以防止你的浏览器超时,但是我可以提供一个对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);

<强> ./路由/ 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]来过滤特定的路径。