- 浏览: 1093184 次
- 性别:
- 来自: 西安
文章分类
- 全部博客 (87)
- J2SE (10)
- Tomcat/Jetty (2)
- Hibernate/iBatis (3)
- Log Framework (1)
- Eclipse (2)
- Ext JS (4)
- jQuery (2)
- Ext GWT (3)
- Pushlet (3)
- GWT (2)
- 工作技巧 (13)
- JMS & ActiveMQ (4)
- Vim/TextMate (4)
- Ruby & Rails (6)
- Javascript (2)
- MacOS (5)
- Database (0)
- Svn/Git (1)
- android (2)
- Ant/Maven (2)
- Lombok (2)
- node (11)
- slidershare (1)
- ubuntu (4)
- 工作总结 (3)
- iphone & ipad (9)
最新评论
-
rchongg:
大神 想问的是 在一般的 登录 和 数据 加密这么两个方面( ...
iOS中使用RSA对数据进行加密解密 -
witcheryne:
<div class="quote_title ...
iOS中使用RSA对数据进行加密解密 -
dgwutao:
我的rsa public_key和priveate_key不是 ...
iOS中使用RSA对数据进行加密解密 -
Vanessa_Rain:
亲,可不可以把你的把你的两个文件借我用一下。我这边不能用呀。可 ...
iOS中使用RSA对数据进行加密解密 -
咕嘟咕嘟_HIT:
请问您这部分代码是只实现了命令解析的功能吗
使用Java编写基于命令行的程序
在上一篇中,我已经实现了如下管理功能,
注意:
本片内容不太适合Express3.x, 建议参考附件中的 nodeblog_express3.x.zip Demo来看
本片介绍如何使用express为nodeblog带来404错误处理
实现功能
- 访问的链接存在的时候,显示页面
- 不存在,则显示404页面, 当然,这里的404是统一处理
技术准备:(2个)
1. Node.js中path模块的使用:
path模块提供一些处理文件路径的功能,采用require('path')来使用。这里我只使用到两个方法:
1). path.normalize(strPath)
将路径标准化, 如'/etc//hosts', 会被标准化成'/etc/hosts'
'/' 分隔符,如果在windows环境中会转换成'\'
2). path.exists(filePath, function(exists))
判断路径是否存在,true: 存在, false: 不存在,该方法还有个同步版: path.existsSync(filePath):boolean
2. Express中的路由控制:
1). 什么是路由?
例如下面代码可以截获 '/users/:id' url, 其中id是url参数 (REST-ful url! You are right!)
app.get('/users/:id', function (req, res, next) {
res.send('id:' + req.params.id)
res.end();
})
用 curl 看一下效果:
2). 使用next做路由控制:
当一个url可以被多个路由匹配,则在response关闭前,调用next()进行路由跳转
app.get('/users/:id', function (req, res, next) { console.log('id: ' + req.params.id); next(); }) app.get('/users/*', function (req, res, next) { console.log('list all user'); res.send('list all users \n'); })
调用next()做路由跳转, 跳转规则按照app.get声明顺序执行。
开始为nodeblog添加404处理:(4步)
1. 调整app.js中的express配置
提高对 public/* 资源路由的优先级:
var express = require('express'); var app = module.exports = express.createServer(); // Configuration app.configure(function(){ app.set('views', __dirname + '/views'); app.set('view engine', 'jade'); app.use(express.bodyParser()); app.use(express.methodOverride()); // 将public提前 app.use(express.static(__dirname + '/public')); app.use(app.router); // 以前在这里 // app.use(express.static(__dirname + '/public')); });
2. 修改对 '/blogs/:title.html' 的路由代码,
添加对文件是否存在的判断,这里需要先引入path模块: var path = require('path');
app.get('/blogs/:title.html', function(req, res, next) { var urlPath = [ 'blogs/', req.params.title, '.md' ].join(''); var filePath = path.normalize('./' + urlPath); path.exists(filePath, function (exists) { if(!exists) { next(); } else { res.render(urlPath, {layout: false}); } }); })
3. 添加404的处理:
app.get('*', function(req, res) { console.log('404 handler..') res.render('404', { status: 404, title: 'NodeBlog', }); })
由于 '*' 也可以匹配 '/blogs/:title.html', 所以在 2 步骤中的next, 会将处理路由到这里。
4. 在views/ 下添加 404.jade 页面:
h1= title img(src="/images/404.jpg")
5. app.js全部代码
require.paths.unshift('./mode_modules'); var express = require('express'); var markdown = require('markdown-js'); var path = require('path'); var app = module.exports = express.createServer(); // Configuration app.configure(function(){ app.set('views', __dirname + '/views'); app.set('view engine', 'jade'); // pase form data to key-value paire app.use(express.bodyParser()); // support put and delete HTTP Standar Method app.use(express.methodOverride()); app.use(express.static(__dirname + '/public')); app.use(app.router); }); app.configure('development', function(){ app.use(express.errorHandler({ dumpExceptions: true, showStack: true })); }); app.configure('production', function(){ app.use(express.errorHandler()); }); app.register('.md', { compile: function(str, options) { var html = markdown.makeHtml(str); return function(locals){ return html.replace(/\{([^}]+)\}/g, function(_, name){ return locals[name]; }); }; } }); var config = { title: 'NodeBlog', author: 'lvjian' } // Routes app.get('/', function(req, res){ res.render('index', { title: config.title + ' - ' + config.author }); }); app.get('/markdown', function(req, res) { res.render('index.md', {layout: false}); }) app.get('/blogs/:title.html', function(req, res, next) { var urlPath = [ 'blogs/', req.params.title, '.md' ].join(''); var filePath = path.normalize('./' + urlPath); path.exists(filePath, function (exists) { if(!exists) { next(); } else { res.render(urlPath, {layout: false}); } }); }) app.get('*', function(req, res) { console.log('404 handler..') res.render('404', { status: 404, title: 'NodeBlog', }); }) app.listen(process.env.VMC_APP_PORT || 3000); console.log("Express server listening on port %d in %s mode", app.address().port, app.settings.env);
参考资料:
What next??
为程序引入单元测试,摆脱修改+刷新的工作方式.
- routedemo.zip (1.2 MB)
- 下载次数: 65
- nodeblog.zip (1.4 MB)
- 下载次数: 117
- nodeblog_express3.x.zip (45.4 KB)
- 下载次数: 52
评论
访问的时候
path.exists,一直返回不存在呢
我log了一下filePath=blogs/first.md
这是为什么呢
app.get('/images/:title.jpg',function(req,res) {
console.log("Request image was called.");
var urlPath = [
// 获取相对路径, 我的应该是:
process.cwd(),
'/images/',
req.params.title, '.jpg'
].join('');
fs.readFile(urlPath, "binary", function(error, file) {
if(error) {
res.writeHead(500, {"Content-Type": "text/plain"});
res.write(error + "\n");
res.end();
} else {
res.writeHead(200, {"Content-Type": "image/jpg"});
res.write(file, "binary");
res.end();
}
});
})
不知道这样做是否规范?
这段代码在windows下不能工作,
首先文件分隔符需要转化下,用path.normalize
其次,images的目录如果是放在public下,使用render函数会自动帮你查找到
如果使用readFile或者sendfile,你要自己加上完整的路径,就是/public/images/
app.get('/images/:title.jpg',function(req,res) {
console.log("Request image was called.");
var urlPath = [
// 获取相对路径, 我的应该是:
process.cwd(),
'/images/',
req.params.title, '.jpg'
].join('');
fs.readFile(urlPath, "binary", function(error, file) {
if(error) {
res.writeHead(500, {"Content-Type": "text/plain"});
res.write(error + "\n");
res.end();
} else {
res.writeHead(200, {"Content-Type": "image/jpg"});
res.write(file, "binary");
res.end();
}
});
})
不知道这样做是否规范?
Express 3.x 变化挺大的, 这篇教程估计要重写了...
静态数据加载的问题我检查了一下. 现在Express默认采用router的方式, 资源定为估计是按照router路径进行的, 在app.js的configure中去掉router部分代码即可:
// Configuration app.configure(function(){ app.set('port', process.env.VMC_APP_PORT || 3000); app.set('views', __dirname + '/views'); app.set('view engine', 'jade'); app.use(express.favicon()); app.use(express.logger('dev')); app.use(express.bodyParser()); app.use(express.methodOverride()); // app.use(app.router); app.use(express.static(path.join(__dirname, 'public'))); });
新代码我已上传, module 我删掉了, 运行需要重新 npm install
res.sendfile(urlPath);
app.get('/images/:title.jpg',function(req,res) {
console.log("Request image was called.");
var urlPath = [
// 获取相对路径, 我的应该是:
process.cwd(),
'/images/',
req.params.title, '.jpg'
].join('');
fs.readFile(urlPath, "binary", function(error, file) {
if(error) {
res.writeHead(500, {"Content-Type": "text/plain"});
res.write(error + "\n");
res.end();
} else {
res.writeHead(200, {"Content-Type": "image/jpg"});
res.write(file, "binary");
res.end();
}
});
})
不知道这样做是否规范?
发表评论
-
使用node.js编写工具简化less编译(less2css.js)
2013-05-19 11:06 14970Less 是一个非常优秀的 ... -
使用Commander.js驯服node.js的命令行参数
2011-10-14 15:59 11350Commander.js是Ruby中Commander在no ... -
使用node.js建博客文章总汇
2011-09-14 21:54 7677最近心血来潮,用node.js写了一个简单的markd ... -
使用node.js建博客(六) - 添加代码高亮的支持 (Final)
2011-09-14 21:50 6121本片为《用node.js建博客》系列的最后一篇,如果你第一看 ... -
用node.js建博客(五) - 用vows以BDD方式测试程序
2011-09-12 10:32 5924BDD? 行为测试驱动开发 ... -
用node.js建博客(三) - 用markdown写静态博客
2011-09-10 11:47 10263如果是第一次看到本篇,你可能需要看前面两篇: ... -
用node.js建博客(二) - 构建第一个markdown页面
2011-09-04 23:52 25054上面文章《NodeBlog(一) - ... -
用node.js建博客(一) - node.js安装及Express框架简介
2011-09-03 23:04 57337最近写博客频率有写频繁,很多时候像展示一些代码,不过java ... -
从文件上传开始, 进入node.js的世界
2011-08-30 11:49 15803什么是node.js, 以及node.js的生态系统,Inf ... -
将使用npm管理的node.js项目部署到vCloudLabs
2011-08-29 10:06 8589vCloudLabs是WMWare提供的云计算服务器,类似He ...
相关推荐
Chapter 8: Building Node.js REST API Servers with Express.js and Hapi Chapter 9: Real-Time Apps with WebSocket, Socket.IO, and DerbyJS Chapter 10: Getting Node.js Apps Production Ready Chapter 11: ...
Node.js-Express-MongoDB构建simple_blog
mongo-express - 基于Web的MongoDB管理界面,采用Node.js、 Express和Bootstrap3开发
node.js + express + mysql 包含前端博客展示、后台管理、node后端。整套博客系统开箱即用,对elemen-ui二次封装组件非常便利,管理端权限模块,用户登录,验证码,token验证,文章编辑,修改,查看,发布,评论,...
第1章 初识 Node.js.ppt 第2章 Javascript基础.ppt 第3章 Node.js基础入门.ppt 第4章 异步编程与包管理.ppt 第5章 http模块.ppt 第6章 Web开发中的模板引擎.ppt 第7章 Node.js中的文件操作.ppt 第8章 认识express...
NULL 博文链接:https://witcheryne.iteye.com/blog/1165067
node-express-by-hbs解决方案,优化项目结构,引用并重写基础依赖
适用于SPA的SSO(单点登录)实践,express框架基础上,使用redis作为session的store
Beginning Node.js is your step-by-step guide to learning all the aspects of creating maintainable Node.js applications. You will see how Node.js is focused on creating high-performing, highly-scalable...
MySQL 这是带有mysql 8.0的node.je Express(ejs)的演示博客克隆git clone https://github.com/explooosion/Node.js-Express-With-MySQL.git进入项目cd Node.js-Express-With-MySQL安装npm install启动MySQL 使用...
nodejs-docker-express 使用Node.js的Docker仓库-Express Demo App
先决条件: 安装节点打开 Node.js 命令提示符,然后全局安装名为 express 的 Web 应用程序框架(-g 选项),而不是特定于您的项目npm install –g express-generator 安装 Nodemon,Nodemon 是一个实用程序,它将...
技术栈:vue2.0 vuex vue-router ES6/ES7 webpack lass nodejs express MongoDB
Node.js Web Development: Build secure and high performance web applications with Node.js 10 Node.js is a server-side JavaScript platform using an event-driven, non-blocking I/O model allowing users to...
Express 是一个简洁而快速的 node.js Web开发框架, 提供一系列强大特性帮助你创建各种Web应用。Express 不对 node.js 已有的特性进行二次抽象,我们只是在它之上扩展了Web应用所需的功能。
前端基于vue.js+element-ui,后端基于node+express,数据库使用sql,网络请求使用axios的校园疫情管理系统 基于vue+node.js+mysql的校园疫情管理系统.zip 前端基于vue.js+element-ui,后端基于node+express,数据库...
strong-build - 构建node包至可部署的应用中