Express开始安装Express一个极简的Express程序生成程序开发框架package.json文件Express猜不到你要用哪个版本的依赖,所以你最好给模块主要、次要和修订号,以避免引入意外错误。例如,如果你指定“express”:“3.0.0”来添加最新版本的模块,比如这里的EJS,你可以在安装时将--save标志传递给npm。因此,每当express(1)生成一个package.json文件时,您都需要安装依赖项(如图8-9所示)。执行npminstall安装依赖,然后执行nodeapp.jslauncher。在浏览器中访问http://localhost:3000查看程序Express驱动配置系统设置环境变量这些环境变量会出现在你程序中的process.env对象中虽然环境变量NODE_ENV起源于Express,但现在很多Node框架都有用它来告知Node程序自己处于什么环境,默认是开发环境。如清单8-3所示,app.configure()方法接受一个表示环境的可选字符串和一个函数。当环境匹配传入的字符串时,会立即调用回调函数;Express视图系统配置更改搜索目录_dirname:更改默认视图模板引擎因为你创建的程序用-e,它会默认使用ejs作为视图模板;可以通过以下设置更改默认视图模板。使用文件扩展名指定模板引擎通过添加后缀强制改变默认的模板视图缓存。在生产环境中,视图缓存设置将默认启用,并阻止后续的render()调用执行硬盘I/O。模板的内容保存在内存中,这显着提高了性能。启用此设置的副作用是模板文件编辑仅在服务器重新启动后生效,因此在开发期间禁用它。ViewLookup当调用res.render()或app.render()时,Express会首先检查这个绝对路径下是否有文件。然后它会找到视图目录设置的相对路径。Express会尝试使用索引文件视图来显示假的照片数据列表路由添加photos.list路由在./app.js中引入photos模块来访问您刚刚编写的exports.list函数。为了在首页/显示照片,必须将photos.list函数传递给app.get()方法,该方法会将路径/上的HTTPGET方法映射到该函数,并编写照片列表视图的模板将数据输出到视图将局部变量直接传递给res.render()的方法使用app.locals传递程序级变量Express默认只会输出一个程序级变量到视图,settings,这个对象包含具有app.set()值的所有设置。例如,app.set('title','MyApplication')会将settings.title输出到模板。为了方便,app.locals也被做成一个JavaScript函数。当传入一个对象时,所有的键都会被合并。如果你有一个导出几个函数的Node模块helpers.js,你可以像这样将所有函数导出到视图:通过请求级locals和res.locals变量处理表单和文件上传实现照片上传功能分三步:?定义照片模型;?创建照片上传表单;?显示照片列表。设置照片上传目标URL的自定义配置项实现了照片模型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
