我有一个基本的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文件中。当我请求其中一个页面时,标题在我的浏览器选项卡上正确显示,但页面不显示,它只是继续加载。奇怪的是,当我取消请求页面显示时。就好像一切正常但没有任何东西告诉过程结束?
我对节点相对较新,请原谅我对上述任何一点的天真。如果有任何问题我可以澄清,请告诉我。
答案 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]来过滤特定的路径。