Nic*_*ing 1 javascript http node.js express pug
我有一个node.js应用程序,当我尝试加载主页时,我遇到了错误消息.我将尽力在下面列出我的架构.它是index.js - > server.js - > router.js - > requestHandlers.js
我正在使用express(www.expressjs.com)和nodebeginner.org的组合.很抱歉这个问题很长..只是希望获得尽可能多的信息.
index.js(创建包含路径名/请求处理程序信息的句柄对象,调用启动服务器的函数)我从这里开始使用router.route并将其传递给每一步
var server = require("./server");
var router = require('./router');
var requestHandlers = require('./requestHandlers');
// Routes
var handle = {}
handle['/'] = requestHandlers.home;
server.start(router.route, handle)
Run Code Online (Sandbox Code Playgroud)
server.js(启动服务器,这是我想要配置服务器的地方,从URL获取路径名,并将其传递给路由模块)
var http = require("http");
var url = require('url');
var express = require('express');
function start (route, handle) {
var onRequest = function(request, res) {
var pathname = url.parse(request.url).pathname;
console.log("request for " + pathname + " recieved.");
route(handle, pathname, res);
}
var app = express.createServer(onRequest).listen(8888);
if (app.configure) {
console.log('app exists'); //logging correctly
}
// Configuration
app.configure(function(){
app.set('views', __dirname + '/views');
app.set('view engine', 'jade');
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(app.router);
app.use(express.static(__dirname + '/public'));
});
app.configure('development', function(){
app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
});
app.configure('production', function(){
app.use(express.errorHandler());
});
console.log("Express server listening on port %d in %s mode", app.address().port, app.settings.env); //logs correct with 8888 and development
}
exports.start = start;
Run Code Online (Sandbox Code Playgroud)
router.js(从index - > server传递的函数路由调用router.js中的路由函数,调用与handle对象中的路径名匹配的requestHandler)
function route (handle, pathname, res) {
console.log("About to route a request for" + pathname); //About to route a request for/stylesheets/style.css SEE BELOW******* this is the error
if (typeof handle[pathname] === 'function') {
handle[pathname] (res);
}
else {
console.log('no request handler found for' + pathname);
}
}
exports.route = route;
Run Code Online (Sandbox Code Playgroud)
requestHandler.js(与res/req对象交互,函数映射到某些路径名,只有在路由器请求这些路径名时才会调用)
var home = function(res){
res.render('index', { title: 'WWYB?' });
console.log('homepage rendered'); //correctly logs for pathname = '/'
//click();
};
exports.home = home;
Run Code Online (Sandbox Code Playgroud)
***当我去请求localhost:8888时,它试图发出一堆请求.首先它正确地请求"/"然后继续记录所有说"关于路由/ stylesheets/style.css的请求"的事件最终页面加载没有css.我的layout.jade文件中指示的路径名正好是'/stylesheets/style.css'.
为什么路径名要评估到/stylesheets/style.css?我认为节点在后台做了一些事情我并不完全理解它.
如果您需要更多信息,请告诉我.谢谢!
就像@TJHolowaychuk评论你真的应该查看手册,并遵循一堆教程.无论如何,我会尽力帮助你.
这是一个非常基本的解释.Express允许您使用子应用程序,因此您可以将不同的应用程序部分放在不同的文件中.它也拥有自己的路由器.如果在处理路由之前需要对请求和/或响应执行某些操作,则可以创建中间件.如果您需要在不同模块中进行配置,请在其中返回一个函数.
这是server.js的一个例子:
var $express = require('express'),
app = module.exports = $express.createServer(),
subapp = require('./subapp'),
configure = require('./configure');
// Each of our own configure returns a function that will be
// called by app.configure
app.configure(configure.all(app));
app.configure('development', configure.devel(app));
app.configure('production', configure.prod(app));
// Use our sub application
app.use(subapp);
// Now listen
app.listen(3030)
Run Code Online (Sandbox Code Playgroud)
subapp.js:
var $express = require('express'),
subapp = module.exports = $express.createServer();
// Add a handler for GET / to our sub-application
subapp.get('/', function (req, res) {
res.end('Hello world!');
});
Run Code Online (Sandbox Code Playgroud)
最后configure.js:
var $express = require('express');
exports.all = function (app) {
return function () {
// Global configurations
app.use($express.bodyParser());
app.use($express.methodOverride());
app.set('views', __dirname + '/views');
app.set('view engine', 'jade');
app.use($express.static(__dirname + '/public'));
//...
// If you want to do something with/on the request/response
// you can create a middleware
app.use(function (req, res, next) {
console.log('caught request %s %s', req.method, req.path);
// Don't forget the callback
next();
});
};
};
exports.devel = function (app) {
return function () {
// Development configurations
};
};
//...
Run Code Online (Sandbox Code Playgroud)
转到localhost:3030您最喜欢的浏览器,它显示"Hello world!",这是我们的请求处理程序.如果你看终端,你会看到"抓住请求GET /",这是我们的中间件.
您的样式表,客户端javascripts等应该在/ public.app.use(express.static(__dirname + '/public'))将服务于这些.
假设你有/public/stylesheets/all.css,然后在你的玉模板中你可以像这样包含它link(rel='stylesheet', href='/public/stylesheets/all.css')
现在,在考虑将某些内容部署到生产之前,您将不得不尝试并了解有关节点和表达的更多信息,这些网站可能会帮助您:
希望这个微小的tut帮助你.
| 归档时间: |
|
| 查看次数: |
2636 次 |
| 最近记录: |