Express起步
安装Express
一个最小的Express 程序
生成程序开发框架
package.json文件
Express猜不出你要用依赖项的哪个版本,所以你最好给出模块的主要、次要及修
订版本号,以免引入意料之外的bug。比如明确给出"express":"3.0.0"
要添加模块的最新版,比如这里的EJS,可以在安装时给npm传入--save标记。
得到
不管express(1)什么时候生成package.json文件,你都需要安装依赖项(如图8-9所示)。执行npm
install安装依赖项,然后执行node app.js启动程序。在浏览器中访问http://localhost:3000查
看程序
Express驱动配置系统
设置环境变量
这些环境变量会出现在你程序里的process.env对象中
尽管环境变量NODE_ENV源自Express,但现在很多Node框架都用它通知Node程序它在什么环
境中,默认为开发环境。
如代码清单8-3所示, app.configure()方法接受一个表示环境的可选字符串,以及一个函
数。当环境与传入的字符串相匹配时,回调函数会被立即调用;
Express视图系统配置
改变查找目录
_dirname:
改变默认视图模板引擎
因为原先你通 -e 创建的程序,它会默认 用ejs 作为视图模板;
通过下面的设置可以改变默认视图模板
用文件扩展名指定模板引擎
通过加后缀名的方式强制改变默认模板
视图缓存
- 生产环境中会默认启用view cache设定,并防止后续的render()调用执行硬盘I/O。
- 模板的内容保存在内存中,性能会得到显著提升。
- 启用这个设定的副作用是只有重启服务器才能让模板文件的编辑生效,所以在开发时会禁用它。
视图查找
- 当res.render()或app.render()被调用时, Express会先检查是否有文件在这个绝对路径上。
- 接着会找视图目录设定的相对路径。
- Express会尝试使用index文件
视图显示
虚假照片数据
列表路由
添加photos.list路由
在./app.js中引入photos模块,访问你刚刚写好的exports.list函数。
为了在首页/中显示照片,要把photos.list函数传给app.get()方法,它会把路径/上的HTTP GET方法
映射到这个函数上
写照片列表视图的模板
将数据输出到视图中的方法
- 将本地变量直接传给res.render()
- 用app.locals传递程序层面的变量
Express默认只会向视图中输出一个程序级变量, settings,这个对象中包含所有用app.set()设定的值。比 如app.set('title', 'My Application')会把settings.title输出到模板中
为了方便, app.locals也被做成了一个JavaScript函数。当有对象传入时,所有的键都会被合并
如果你有一个输出了几个函数的Node模块helpers.js,可以像下面这样把所有函数输出到视图中: - 用res.locals传递请求层面的本地变量
处理表单和文件上传
实现照片上传功能总共分三步:
定义照片模型;
创建照片上传表单;
显示照片列表。
设定照片上传目的地址的定制配置项
实现照片模型
Mongoose的模型上有所有的CRUD方法(Photo.create、 Photo.update、 Photo.remove
和Photo.find),所以这样就搞定了。
创建照片上传表单
你要把照片目录传给POST处理器,并返回一个路由回调,以便处理器可以访问这个目录。
把新路由添加到app.js中,放在默认(/)路由下面:
处理照片提交
- multipart()中间件(包含在bodyParser中),它会给你一个req.files对象,代表上
传的文件,并把这个文件保存到硬盘中。 - 你可以通过req.files.photo.image访问这个对象。上传表单中的输入域, photo[name],可以通过req.body.photo.name访问到
显示上传照片列表
用Mongoose提供的Photo.find获取你上传的照片
创建资源下载
创建照片下载路由 /photo/:id/download
在模板中添加标记:
app.js中,在路由定义中找个你喜欢的地方把下面这条路由加进去:
实现照片下载路由
设定下载的文件名
你可以用res.download()的第二个参数定义一个定制的文件名,在下载时取代默认的原始
文件名。代码清单8-21修改了之前的实现,给出照片被上传时提供的名称,比如Flower.jpeg
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。