Express起步

安装Express
clipboard.png

一个最小的Express 程序
clipboard.png

生成程序开发框架
clipboard.png

package.json文件

clipboard.png
Express猜不出你要用依赖项的哪个版本,所以你最好给出模块的主要、次要及修
订版本号,以免引入意料之外的bug。比如明确给出"express":"3.0.0"

要添加模块的最新版,比如这里的EJS,可以在安装时给npm传入--save标记。
clipboard.png

得到
clipboard.png

不管express(1)什么时候生成package.json文件,你都需要安装依赖项(如图8-9所示)。执行npm
install安装依赖项,然后执行node app.js启动程序。在浏览器中访问http://localhost:3000查
看程序
clipboard.png

Express驱动配置系统

clipboard.png

设置环境变量
clipboard.png

这些环境变量会出现在你程序里的process.env对象中

尽管环境变量NODE_ENV源自Express,但现在很多Node框架都用它通知Node程序它在什么环
境中,默认为开发环境。

如代码清单8-3所示, app.configure()方法接受一个表示环境的可选字符串,以及一个函
数。当环境与传入的字符串相匹配时,回调函数会被立即调用;

clipboard.png

Express视图系统配置

改变查找目录
clipboard.png
_dirname:
clipboard.png

改变默认视图模板引擎
因为原先你通 -e 创建的程序,它会默认 用ejs 作为视图模板;
通过下面的设置可以改变默认视图模板
clipboard.png

用文件扩展名指定模板引擎
通过加后缀名的方式强制改变默认模板
clipboard.png

视图缓存

  1. 生产环境中会默认启用view cache设定,并防止后续的render()调用执行硬盘I/O。
  2. 模板的内容保存在内存中,性能会得到显著提升。
  3. 启用这个设定的副作用是只有重启服务器才能让模板文件的编辑生效,所以在开发时会禁用它。

视图查找

  1. 当res.render()或app.render()被调用时, Express会先检查是否有文件在这个绝对路径上。
  2. 接着会找视图目录设定的相对路径。
  3. Express会尝试使用index文件

clipboard.png

视图显示

clipboard.png

虚假照片数据
clipboard.png

列表路由
clipboard.png

添加photos.list路由
在./app.js中引入photos模块,访问你刚刚写好的exports.list函数。
为了在首页/中显示照片,要把photos.list函数传给app.get()方法,它会把路径/上的HTTP GET方法
映射到这个函数上
clipboard.png

写照片列表视图的模板
clipboard.png

将数据输出到视图中的方法

  1. 将本地变量直接传给res.render()
    clipboard.png
  2. 用app.locals传递程序层面的变量
    Express默认只会向视图中输出一个程序级变量, settings,这个对象中包含所有用app.set()设定的值。比 如app.set('title', 'My Application')会把settings.title输出到模板中
    clipboard.png
    clipboard.png
    为了方便, app.locals也被做成了一个JavaScript函数。当有对象传入时,所有的键都会被合并
    如果你有一个输出了几个函数的Node模块helpers.js,可以像下面这样把所有函数输出到视图中:
    clipboard.png
  3. 用res.locals传递请求层面的本地变量

处理表单和文件上传

实现照片上传功能总共分三步:
 定义照片模型;
 创建照片上传表单;
 显示照片列表。

设定照片上传目的地址的定制配置项
clipboard.png

实现照片模型
clipboard.png
Mongoose的模型上有所有的CRUD方法(Photo.create、 Photo.update、 Photo.remove
和Photo.find),所以这样就搞定了。

创建照片上传表单
你要把照片目录传给POST处理器,并返回一个路由回调,以便处理器可以访问这个目录。
把新路由添加到app.js中,放在默认(/)路由下面:
clipboard.png

处理照片提交

  1. multipart()中间件(包含在bodyParser中),它会给你一个req.files对象,代表上
    传的文件,并把这个文件保存到硬盘中。
  2. 你可以通过req.files.photo.image访问这个对象。上传表单中的输入域, photo[name],可以通过req.body.photo.name访问到
    clipboard.png
    clipboard.png

显示上传照片列表
用Mongoose提供的Photo.find获取你上传的照片
clipboard.png

创建资源下载

创建照片下载路由 /photo/:id/download
在模板中添加标记:
clipboard.png
app.js中,在路由定义中找个你喜欢的地方把下面这条路由加进去:
clipboard.png

实现照片下载路由
clipboard.png
设定下载的文件名
你可以用res.download()的第二个参数定义一个定制的文件名,在下载时取代默认的原始
文件名。代码清单8-21修改了之前的实现,给出照片被上传时提供的名称,比如Flower.jpeg
clipboard.png


lidog
119 声望3 粉丝