1

我有一个基本的 expressjs 应用程序(使用翡翠),但我无法渲染基本的翡翠文件。当我收到请求时,我会解析路径名的 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

我不是 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);

./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 回答