Node填坑教程——整理文件

如果你能把所有代码写进一个文件,并且能很好的管理、协调、多人开发。那么可以跳过这期(请务必带我飞)。

我们接着完善上期的代码,给代码分家。

node并没有启动入口,更没有固定的项目结构,文件配置。这些全部要靠自己动手,靠约定,正所谓约定由于配置。因为作者书读的少,只会MVC结构,姑且按照MVC结构来分。

建立如下目录。

  • /bin/ : 项目的启动文件,也可以放其他乱七八糟的脚本。如果你有多种环境或者多个入口,这样分就很有必要的
  • /configure/ : 配置文件,上图中根据生产环境和开发环境配置了两个文件夹,分别是development和production
  • /lib/ : js源代码,app.js文件也在这里
  • /logs/ : 日志文件
  • /node_modules/ : 通过npm包管理中间件都在这,包括session,模板,日志等中间件,你自己安装的中间件也在这
  • /public/ : 暴露的文件夹,从名字就可以看出,图面前端js脚本和css会在这里
  • /src/ : 其他语言的文件,如果是coffeescript的项目,编译前的文件会放在这里,编译后的文件在lib里,这里我们暂时用不到
  • /test/ : 单元测试
  • /views/ : 模板文件
  • /app.js : 约定俗成的项目入口
  • /package.json : 配置你项目依赖的包,使用npm命令 npm install -d 会自动安装里面记录的中间件,非常方便。由于nodejs的中间件不完全是脚本组成的,也会包含C写的编译文件,各环境下不尽相同,所以通过npm,本地下载编译是非常重要的

下面我们来填充文件

lib/app.js

1 var express = require(‘express‘);
2 var app = express();
3
4 module.exports = app;

bin/start.js

1 var app = require(‘../lib/app‘);
2
3 var port = 3000;
4 var server = app.listen(port, function () {
5     console.log(‘http server listening on port %s‘, server.address().port);
6 });

这里bin/start.js充当程序的启动文件。通过node bin/start.js启动项目。现在访问http://127.0.0.1:3000/能看到Cannot GET /的字样就说明成功了。

我们来写第一个路由

controllers/homeController.js

1 var action = {
2     get: function (req, res, next) {
3         return res.send(‘ok‘);
4     }
5
6 };
7
8 module.exports = action;

routes/homeRoute.js

1 var express = require(‘express‘);
2 var controller = require(‘../controllers/homeController‘);
3 var router = express.Router();
4
5 router.get(‘/‘, controller.get);
6
7 module.exports = router;

routes/index.js

1 var homeRoute = require(‘./homeRoute‘);
2 module.exports = function (app) {
3     app.use(homeRoute);
4 }

routes/app.js

 1 var path = require(‘path‘);
 2 var express = require(‘express‘);
 3 var route = require(‘./routes‘);
 4 var bodyParser = require(‘body-parser‘);
 5 var app = express();
 6
 7 app.use(bodyParser.json());
 8 app.use(bodyParser.urlencoded({ extended: true }));
 9
10 route(app);
11
12
13 module.exports = app;

现在第一个路由已经配置好了,访问 http://127.0.0.1:3000/ 就能看到ok的提示。

接下来我们添加一个能交互的页面。

首先我们需要一个模板引擎,使用npm安装

E:\project\heron-lesson\demo3>npm install ejs --save

修改app.js文件

 1 var path = require(‘path‘);
 2 var express = require(‘express‘);
 3 var route = require(‘./routes‘);
 4 var bodyParser = require(‘body-parser‘);
 5 var app = express();
 6 app.use(bodyParser.json());
 7 app.use(bodyParser.urlencoded({extended: true}));
 8 app.set(‘views‘, path.join(__dirname, ‘../views‘));
 9 app.set(‘view engine‘, ‘ejs‘);
10 app.engine(‘ejs‘, require(‘ejs‘).renderFile);
11 route(app);  // 路由文件分开
12
13
14 module.exports = app;

由于我们还没讲到数据库,那么先缓存几个数据吧

controllers/listController.js

1 var data = [
2     {name: ‘张三‘, age: 20},
3     {name: ‘李四‘, age: 22}
4 ];

继续填充路由

1 var action = {
2     index: {
3         get: function (req, res, next) {
4             return res.render(‘list/index‘, {data: data});
5         }
6     }
7 };
8
9 module.exports = action;

routes/listRoute.js

1 var express = require(‘express‘);
2 var controller = require(‘../controllers/listController‘);
3 var router = express.Router();
4
5 router.get(‘/index‘, controller.index.get);
6
7 module.exports = router;

routes/index.js,我们这里用了个小技巧给list路由加上了目录/list

1 var homeRoute = require(‘./homeRoute‘);
2 var listRoute = require(‘./listRoute‘);
3 module.exports = function (app) {
4     app.use(homeRoute);
5     app.use(‘/list‘, listRoute);
6 }

views/list/index.ejs

 1 <!doctype html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>List</title>
 6 </head>
 7 <body>
11 <ul>
12     <% data.forEach(function (item) { %>
13     <li>姓名:<%= item.name %>,年龄:<%= item.age %></li>
14
15     <% }) %>
16 </ul>
17
18 </body>
19 </html>

现在访问http://127.0.0.1:3000/list/index ,就能看到两行数据了。注意,如果你输出的中文有问题,请更改你的代码文件,保存为utf-8。

姓名:张三,年龄:20
姓名:李四,年龄:22

我们再添加一个搜索功能

修改页面 /views/list/index.ejs

 1 <!doctype html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>List</title>
 6 </head>
 7 <body>
 8 <form action="" method="post">
 9     搜索:<input type="text" name="q"/> <input type="submit"/>
10 </form>
11 <ul>
12     <% data.forEach(function (item) { %>
13     <li>姓名:<%= item.name %>,年龄:<%= item.age %></li>
14
15     <% }) %>
16 </ul>
17
18 </body>
19 </html>

同上controllers、routes都得改

controllers/listController.js

 1 var data = [
 2     {name: ‘张三‘, age: 20},
 3     {name: ‘李四‘, age: 22}
 4 ];
 5
 6 var action = {
 7     index: {
 8         get: function (req, res, next) {
 9             return res.render(‘list/index‘, {data: data});
10         },
11         post: function (req, res, next) {
12             var list = [];
13             data.forEach(function (item) {
14                if (item.name === req.body.q)
15                    list.push(item);
16             });
17             return res.render(‘list/index‘, {data: list});
18         }
19     }
20 };
21
22 module.exports = action;

routes/listRoute.js

1 var express = require(‘express‘);
2 var controller = require(‘../controllers/listController‘);
3 var router = express.Router();
4
5 router.get(‘/index‘, controller.index.get)
6     .post(‘/index‘, controller.index.post);
7
8 module.exports = router;

刷新页面。

就可以根据name字段来完全搜素了。



彩蛋:

每次都要修改routes里的多个文件来路由,是不是太麻烦了呢。

D:\project\heron-lesson\demo3>npm install heron-mvc

安装heron-mvc。github: https://github.com/iheron/heron-mvc

修改lib/app.js

 1 var path = require(‘path‘);
 2 var express = require(‘express‘);
 3 var route = require(‘./routes‘);
 4 var bodyParser = require(‘body-parser‘);
 5 var app = express();
 6 var mvc = require(‘heron-mvc‘);
 7
 8 app.use(bodyParser.json());
 9 app.use(bodyParser.urlencoded({extended: true}));
10 app.set(‘views‘, path.join(__dirname, ‘../views‘));
11 app.set(‘view engine‘, ‘ejs‘);
12 app.engine(‘ejs‘, require(‘ejs‘).renderFile);
13
14 mvc.route.load({
15     routeDir: path.join(__dirname, ‘./routes‘),
16     controllerDir: path.join(__dirname, ‘./controllers‘)
17 }, function (data) {
18     app.use("/" + data.route, data.router); // 优先加载路由
19 }, function (data) {
20     app[data.method]("/" + data.controller + "/" + data.action, data.func); // 没有路由直接加载控制器 会根据控制器的前缀和action名称 生成两级目录
21 });
22
23
24 module.exports = app;

现在是见证奇迹的时候了。不用再改routes 来处理路由了,甚至可以删除这个了。

该插件会根据controller的前缀和action的名称来自动生成两级目录。如果你要手动控制路由,也会优先加载路由配置。

该项目下载地址:demo3

下载后需通过npm install -d 来安装依赖

下一期如果内容过多会考虑录成视频。大家如果有什么想看的可以给我留言。

时间: 2024-08-15 13:54:43

Node填坑教程——整理文件的相关文章

Node填坑教程——前言

Node是什么? Node 是一个服务器端 JavaScript 解释器,它将改变服务器应该如何工作的概念.它的目标是帮助程序员构建高度可伸缩的应用程序,编写能够处理数万条同时连接到一个(只有一个)物理机的连接代码. 以上是比较官方的解释.简单来说,就相当于一个开发平台,不过这个平台及其简陋,官方没有ide(其实也不太需要),它不像php需要容器来运行,所有的开发.调试.管理.发布等工具都是民间的自己动手的产物,所以也诠释了为什么它的目标是帮助程序员构建高度可伸缩的应用程序. 进来发现Node有

Node填坑教程——HelloWorld

环境安装(极简): Node需要的环境可以说及其简单,也可以说及其复杂.为什么这么说呢? 如果里只需要运行环境那么到Node官网下载一个包就行了.里面自带npm管理工具,这是包管理工具,以后会频繁的使用它的功能.这时候Node的基本环境已经齐备了,尽管没有ide,没有测试,没有代码管理,没有其他的编译环境(C.C++.Python等).安装步骤不管是windows还是mac都是下一步的事,这里就不多说了. 那么,我们先从这样一个状态下进入Hello World. 打开终端,windows下开始-

Node填坑教程——常用库

作为函数式编程来说,流程控制和函数库是必不可少的(应该吧). 下面我们介绍两个常用的库. lodash:完整的api请参阅,https://lodash.com/docs.这里我们只演示几个简单的例子. 安装 E:\project\heron-lesson\demo4>npm install lodash --save 1 var data1 = [1, 2, 3, 4, 5]; 2 var data2 = [ 3 {'user': 'barney', 'age': 36, 'active':

Node填坑教程——过滤器

所谓“过滤器”,只是一个概念,可以理解是一个路由,也可以理解为一个中间件.原理非常简单,就是利用匹配规则,让其有限匹配在正常的路由前面处理就行了. 比如有如下路由 1 app.get('/', function (req, res, next) { 2 res.send('index'); 3 }); 访问根目录就能看到index.在前面加上一个路由,封锁全部请求 1 app.use(function (req, res, next) { 2 return res.send('filter');

在CENTOS7下安装kubernetes填坑教程(原创)

kubernetes(以下简称"k8s")目前是公认的最先进的容器集群管理工具,在1.0版本发布后,k8s的发展速度更加迅猛,并且得到了容器生态圈厂商的全力支持,这包括coreos.rancher等,诸多提供公有云服务的厂商在提供容器服务时也都基于k8s做二次开发来提供基础设施层的支撑,比如华为.可以说k8s也是Docker进军容器集群管理和服务编排领域最为强劲的竞争对手. 现在的Red Hat centos7的用户,已经可以使用熟悉的yum来直接安装k8s,但是真要安装起来,还是有相

Android项目开发填坑记-so文件引发的攻坚战

原文地址 http://blog.csdn.net/ys743276112/article/details/50903905 java.lang.UnsatisfiedLinkError 解决方法 主要内容 安装包在只编译了armeabi,没有x86.arm64-v8a,是如何运行在各种处理器的手机上的? https://www.zhihu.com/question/36893314/answer/69467752 arm64-v8a是可以向下兼容的,但前提是你的项目里面没有arm64-v8a的

小程序项目之再填坑

简诉 是的,真的,你没有看错,我就是上次那个加薪的,但是现在问题来了,最近又搞了个小程序的需求,又填了不少坑,其中的辛酸就不说了,说多了都是泪,此处省略三千字 ---^--,说重点吧,反正最后就是差点这让老板叫走人了,你说优秀不优秀-. 前段时间网上一直说的"<你可以骂那些中年人,尤其是有车有房的-->",虽然我没有房.也没有车,但也坚决不做那个可以随便骂的中年人(人到中年不如狗??),不存在的啦,这个仇宝宝已经记下了,先分享一下最近遇到的几个坑吧. -- 我是首席填坑官-

初涉node.js做微信测试公众号一路填坑顺便发现个有趣的其他漏洞

[微信测试公众号] 半年前耍着玩搭起来的“微信简历”,是LAMP版的,很皮毛. 微信的官方文档在这 http://mp.weixin.qq.com/wiki/index.php 1.获取access token 2.自定义菜单创建,直接在调试工具上做了 http://mp.weixin.qq.com/debug 3.接入指南(接入自己的网站) 4.接收微信消息,判断消息类型,判断消息关键字(比如来自哪个按钮),响应消息 这里有个小坑,不同类型的消息数据结构略有不同,判空最好做细致点. [V2.0

Node学习笔记(四):gulp+express+io.socket部署angularJs2(填坑篇)

这篇就先暂停下上篇博客--你画我猜的进度,因为在做这个游戏的时候,想采用最新的ng2技术,奈何坑是一片又一片,这边就先介绍下环境部署和填坑史 既然要用ng2,首先要拿到资源,我这边用的是angularJs2 beta版的,网上的资源有两种,一个是文件全压缩版的.min.js版的另一个就是一大堆乱七八糟的js文件,主要是ng2已经完全采用TypeScript,加之对es6的支持,所以需要引入一大堆兼容,编译文件 这边刚好特别手欠想学学gulp,于是开搞配置gulp环境,压缩所有的js文件成一个mi