nodejs之express4x
学习node好榜样!前阵子看了php,那个模块化编译真的好棒。然而php学习起来不是一般的记不住,毕竟和js还是有不同的。于是转移到了node。看到熟悉的js脚本,心里踏实多了。
话不多讲,php我也是要驾驭的,只是要排到后面去了。今天先来个基于node的框架之express4的模板实例
官网api:http://www.expressjs.com.cn/4x/api.html
1.首先,全局安装。
npm install -g express-generator@4
2.检测安装结果
express --version
3.创建项目,这里我选择d盘node文件夹,安装框架模板。
express -e nodeDemo
4.进入项目安装依赖
cd nodeDemo && npm install
5.运行项目,如果不知道运行命令是啥,打开项目根目录下‘package.json’文件,查看scripts对象里默认第一个的属性名,这个模板里叫start。
npm start
6.运行之后,打开项目根目录下的bin文件夹里的www.js,查看这一句代码:‘var port = normalizePort(process.env.PORT || '3000');’3000就是端口号。基于node服务器本机ip原则。在浏览器输入。
localhost:3000 或者 127.0.0.1:3000
7.项目结构
bin, 存放启动项目的脚本文件
node_modules, 存放所有的项目依赖库。
public,静态文件(css,js,img)
routes,路由文件(MVC中的C,controller)
views,页面文件(Ejs模板)
package.json,项目依赖配置及开发者信息
app.js,应用核心配置文件
8.app.js核心文件说明
// 加载依赖库,原来这个类库都封装在connect中,现在需地注单独加载
var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
// 加载路由控制
var index = require('./routes/index');
var users = require('./routes/users');
// 创建项目实例
var app = express(); // // 定义EJS模板引擎和模板文件位置,也可以使用jade或其他模型引擎比如html
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
//如果选用html模版就把下面的注释并打开把上面这句注释即可。
/*
app.engine('.html', ejs.__express);
app.set('view engine', 'html');
*/ // uncomment after placing your favicon in /public// 定义icon图标
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
// 定义日志和输出级别
app.use(logger('dev'));
// 定义数据解析器
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
// 定义cookie解析器
app.use(cookieParser());
// 定义静态文件目录
app.use(express.static(path.join(__dirname, 'public')));
// 匹配路径和路由
app.use('/', index);
app.use('/users', users); // catch 404 and forward to error handler//404错误
app.use(function(req, res, next) {
var err = new Error('Not Found');
err.status = 404;
next(err);
}); // error handler//500错误
app.use(function(err, req, res, next) {
// set locals, only providing error in development
res.locals.message = err.message;
res.locals.error = req.app.get('env') === 'development' ? err : {}; // render the error page
res.status(err.status || 500);
res.render('error');
});
// 输出模型app
module.exports = app;
9.查看./bin/www文件。
#!/usr/bin/env node /**
* 依赖加载
*/ var app = require('../app');
var debug = require('debug')('nodedemo1:server');
var http = require('http'); /**
* 定义启动端口.
*/ var port = normalizePort(process.env.PORT || '3000');
app.set('port', port); /**
* 创建HTTP服务器实例
*/ var server = http.createServer(app); /**
* 启动网络服务监听端口
*/ server.listen(port);
server.on('error', onError);
server.on('listening', onListening); /**
* 端口标准化函数
*/ function normalizePort(val) {
var port = parseInt(val, 10); if (isNaN(port)) {
// named pipe
return val;
} if (port >= 0) {
// port number
return port;
} return false;
} /**
* HTTP异常事件处理函数
*/ function onError(error) {
if (error.syscall !== 'listen') {
throw error;
} var bind = typeof port === 'string'
? 'Pipe ' + port
: 'Port ' + port; // handle specific listen errors with friendly messages
switch (error.code) {
case 'EACCES':
console.error(bind + ' requires elevated privileges');
process.exit(1);
break;
case 'EADDRINUSE':
console.error(bind + ' is already in use');
process.exit(1);
break;
default:
throw error;
}
} /**
* 事件绑定函数
*/ function onListening() {
var addr = server.address();
var bind = typeof addr === 'string'
? 'pipe ' + addr
: 'port ' + addr.port;
debug('Listening on ' + bind);
}
10.编辑views/index.ejs文件
这里就是前台展示的页面了。可以使用我们熟悉框架啊之类的。文件类型是ejs的,如果想用熟悉的html的,需要在app.js里修改一下就好,我已经在上面代码中写清楚了注释。
11.重点来了,我梦寐以求的模块化网站:把index.ejs页面切分成3个部分:header.ejs, index.ejs, footer.ejs,用于网站页面的模块化。
编辑header.ejs。注意结构!
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<title><%= title %></title>
<link rel="stylesheet" href="http://cdn.bootcss.com/bootstrap/3.3.2/css/bootstrap.min.css">
<link rel='stylesheet' href='/stylesheets/style.css' />
</head>
<body>
编辑footer.ejs。
<script src="http://cdn.bootcss.com/jquery/1.11.2/jquery.min.js"></script>
<script src="http://cdn.bootcss.com/bootstrap/3.3.2/js/bootstrap.min.js"></script>
</body>
</html>
编辑index.ejs。
<% include header.ejs %> <div class="well jumbotron">
<h1><%= title %></h1>
<p>This is a simple hero unit, a simple jumbotron-style component for calling extra attention to featured content or information.</p>
<p><a class="btn btn-primary btn-lg" href="#" role="button">Learn more</a></p>
</div> <% include footer.ejs %>
重新启动项目,刷新页面就会看到结果了。
这里需要注意,如果你的模块组件放在了其他文件夹下 那么引入的命令里是可以加路径的,如果你换成了html模板的话,记得把引入命令也修改了。比如:<% include ./psge/header.html %>
至于路由啊还有更高层次的就到官网上看api吧http://www.expressjs.com.cn/4x/api.html
入门到此结束。
<% include header.ejs %>
<div class="well jumbotron">
<h1><%= title %></h1>
<p>This is a simple hero unit, a simple jumbotron-style component for calling extra attention to featured content or information.</p>
<p><a class="btn btn-primary btn-lg" href="#" role="button">Learn more</a></p>
</div>
<% include footer.ejs %>
nodejs之express4x的更多相关文章
- NodeJs之OS
OS Node.js提供了一些基本的底层操作系统的模块OS. API var os = require('os'); console.log('[arch] 操作系统CPU架构'+os.arch()) ...
- NodeJs之Path
Path模块 NodeJs提供的Path模块,使得我们可以对文件路径进行简单的操作. API var path = require('path'); var path_str = '\\Users\\ ...
- NodeJs之调试
关于调试 当我们只专注于前端的时候,我们习惯性F12,这会给我们带来安全与舒心的感觉. 但是当我们使用NodeJs来开发后台的时候,我想噩梦来了. 但是也别泰国担心,NodeJs的调试是很不方便!这是 ...
- NodeJs在Linux下使用的各种问题
环境:ubuntu16.04 ubuntu中安装NodeJs 通过apt-get命令安装后发现只能使用nodejs,而没有node命令 如果想避免这种情况请看下面连接的这种安装方式: 拓展见:Linu ...
- NodeJs之child_process
一.child_process child_process是NodeJs的重要模块.帮助我们创建多进程任务,更好的利用了计算机的多核性能. 当然也支持线程间的通信. 二.child_process的几 ...
- nodejs进阶(6)—连接MySQL数据库
1. 建库连库 连接MySQL数据库需要安装支持 npm install mysql 我们需要提前安装按mysql sever端 建一个数据库mydb1 mysql> CREATE DATABA ...
- 图片访问实时处理的实现(nodejs和php)
我在访问时光网.网易云音乐等网站时,发现将它们页面中的一些图片URL修改一下就可以得到不同尺寸的图片,于是思考了其实现方案,我的思路是:URL Rewrite + 实时处理 + 缓存,对用户请求的UR ...
- nodejs进阶(4)—读取图片到页面
我们先实现从指定路径读取图片然后输出到页面的功能. 先准备一张图片imgs/dog.jpg. file.js里面继续添加readImg方法,在这里注意读写的时候都需要声明'binary'.(file. ...
- nodejs进阶(3)—路由处理
1. url.parse(url)解析 该方法将一个URL字符串转换成对象并返回. url.parse(urlStr, [parseQueryString], [slashesDenoteHost]) ...
随机推荐
- java 线程 理解 解析
1 线程的概述 进程:正在运行的程序,负责了这个程序的内存分配,代表了内存中的执行区域. 线程:就是在一个进程中负者一个执行路径. 多线程:就是在一个进程中多个执行路径同时执行. 假象: 电脑上的程序 ...
- springmvc(一) springmvc框架原理分析和简单入门程序
springmvc这个框架真的非常简单,感觉比struts2还更简单,好好沉淀下来学习~ --WH 一.什么是springmvc? 我们知道三层架构的思想,并且如果你知道ssh的话,就会更加透彻的理解 ...
- Java 上传下载的
1.上传的步骤: a.导入SmartUpload.jar b.创建一个上传的类的对象 c.初始化 d.上传至服务器 e.保存 注意:表单提交时需要指定enctype=&quo ...
- JavaScript+canvas 利用贝塞尔曲线绘制曲线
效果图: <body> <canvas id="test" width="800" height="300">< ...
- 【Vue】Vue的依赖追踪系统 ——搞懂methods watch和compute
从作用机制和性质上看待methods,watch和computed的关系 <他三个是啥子关系呢?> 首先要说,methods,watch和computed都是以函数为基础的,但各自却都不同 ...
- nopCommerce 3.9 大波浪系列 之 NUnit 配置调试环境
官网:http://nunit.org/ GitHub:https://github.com/nunit 本文只介绍NUnit在VS中的配置使用,进一步学习 NUnit 请参考官方文档. nopCom ...
- http调用端HttpClient、DefaultHttpClient、CloseableHttpClient
1:说下httpClient接口和4.2.6版本后过时实例DefaultHttpClient,以及新的实例应用. 说到HTTP,脑子就冒出它的特性,基于TCP协议,简短点:说明是交互性的. 2:下面 ...
- [javascript] visible - 待写
摘要 jquery 有个筛选器 visible , 一般用于选择 可见元素 $('p:visible') 就是选择可见的 p 元素. 但发现有时候不可用.!!
- 安装完ubuntu16.4.0之后要做的一些优化
1.删除libreoffice libreoffice虽然是开源的,但是Java写出来的office执行效率实在不敢恭维,装完系统后果断删掉 sudo apt-get remove libreoffi ...
- iOS耗电量测试
iOS耗电量测试 本文主要介绍的是使用Energy Diagnostics Instruments来进行iOS耗电量测试. 一.使用方法: 1)iOS 设置选项 ->开发者选项 ->log ...