[关闭]
@greenfavo 2015-08-18T09:45:09.000000Z 字数 2569 阅读 757

nodejs小项目-微博网站

nodejs


一,准备

1,安装express
为了使用express的命令,需要全局安装

  1. npm install -g express

4.x后的版本需要装express-generator才能使用express的命令

用ejs初始化项目结构,在当前目录下创建weibo子目录

  1. express -e ejs weibo

express3以上版本默认把ejs模板引擎中的layout取消了,所以不会在views文件夹下生成layout.ejs。如果要使用,需要到项目目录下运行以下命令,将layout安装到node_modules中

  1. npm install express-partials

然后在app.js 里面引用 express-partials,引用方法:

1.添加引用 var partials = require('express-partials');

2.在 app.set('view engine', 'ejs'); 下面添加 app.use(partials());

在需要引用模板的地方调用 layout:'模版名称' 示例

  1. app.get('/reg', function (req, res) {
  2. res.render('reg', {
  3. title: '用户注册',
  4. layout: 'template'
  5. });
  6. });

用supervisor自动重启nodejs服务器,监控代码变化
比如下面的命令
supervisor app.js将自动重启服务器

二,路由

app.js

  1. var express = require('express');
  2. var routes = require('./routes/index');
  3. var users = require('./routes/users');
  4. var app = express();
  5. //路由定向
  6. app.use('/', routes);
  7. app.use('/users', users);
  8. //创建服务器
  9. var server=app.listen(3000,function(){
  10. var host=server.address().address;
  11. var port=server.address().port;
  12. console.log("test app listening at http://%s:%s",host,port);
  13. })

routes文件夹下user.js路由配置

  1. var express = require('express');
  2. var router = express.Router();
  3. /* GET users listing. */
  4. router.get('/', function(req, res, next) {
  5. res.send('respond with a resource');
  6. });
  7. router.get("/:username",function(req,res){
  8. res.send("user: "+req.params.username);
  9. })
  10. module.exports = router;

在浏览器中输入localhost:3000/user/green就会输出user:green

next()可以改变路由的转移,express默认先匹配最先定义的同名路由,要想执行后面的路由,用next转移

  1. router.all("/:username",function(req,res,next){
  2. //注意同名路由不能发送多次响应内容,不然下一个同名路由不被执行
  3. res.send("all methods captured");//执行该句后请求就关闭了
  4. next();
  5. })
  6. router.get("/:username",function(req,res){
  7. res.send("user: "+req.params.username);//会报错,说headers已发送,不能再设置
  8. })

三,视图(模板引擎)

1,使用ejs模板,它只有以下3中标签

  1. <% code %>//javascript代码
  2. <%= code %>//显示替换过HTML特殊字符的内容
  3. <%-code-%>显示原始的HTML内容

所有模板默认继承layout.ejs中的模板,因此可以将每个页面都用到的导航和footer部分放到layout模板中

2,通过设置layout的属性指定模板

  1. app.get('/reg', function (req, res) {
  2. res.render('reg', {
  3. title: '用户注册',
  4. layout: 'templateName'
  5. });
  6. });

3,express3.0后不支持partial函数,要这样手动引用

首先安装express-partials到项目目录
然后在app.js中require进来,并且在app.js中写上

  1. var partials=require("express-partials");
  2. app.use(partials());

partial是一个可以在视图中使用的函数,它接受两个参数,第一个是片段视图的名称,第二个可以是一个对象或一个数组。如果是一个对象,那么片段视图中上下文变量引用的就是这个对象;如果是一个数组,那么其中每个元素依次被迭代应用到片段视图。片段视图中上下文变量名就是视图文件名,例如下面的'listitems'.

比如在路由文件index.js中写上

  1. router.get("/list",function(req,res){
  2. res.render("list",{
  3. title:"List",
  4. items:["2015","nancy","express","nodejs"],
  5. layout:"template"//template可以是任何名字,不用事先定义template,但一定要写,不然将会输出html源码
  6. });
  7. })

在views文件夹中新建list.ejs文件,内容为

  1. <ul>
  2. //隐式迭代
  3. <%-partial("listitem",items) -%>
  4. </ul>

在建一个listitem.ejs文件

  1. <li><%= listitem %></li>

在浏览器中打开localhost:3000/list将看到生成的li元素(不是源码)

发现在app.js里这样写之后,每个要使用模板的路由都得写上layout:"template",不然浏览器就不能解释成html

  1. app.use(partial());
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注