认真学习,认真记录,每天都要有进步呀!!!

加油叭!!!


一、Express

原生的http在某些方面上不足以满足我们的开发需求,所以我们需要使用框架来提高我们的开发效率,框架的目的就是提高开发效率,让我们的代码更高度统一

1. 什么是express

Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用,和丰富的 HTTP 工具。

使用 Express 可以快速地搭建一个完整功能的网站。

express官网: http://expressjs.com/

2.Express 框架核心特性:

1)可以设置中间件来响应 HTTP 请求。
2)定义了路由表用于执行不同的 HTTP 请求动作。
3)可以通过向模板传递参数来动态渲染 HTML 页面。

3.Express的安装

安装文档: http://expressjs.com/en/starter/installing.html



安装步骤详情:

  1. 创建一个项目

  2. 切换到项目目录下去初始化
$ npm init -y



3. 安装express

$ npm install express --save / npm i --S express

4. hello world example

官方文档:http://expressjs.com/en/starter/hello-world.html

栗子:

// 1. 引包
var express = require('express')
// 2. 创建你服务器应用程序
// 也就是原来的 http.createServer
var app = express()
// 3.当服务器收到请求/的时候,执行回调处理函数
app.get('/', function (req, res) {
res.send('Hello World!')
})
// 4. 相当于 server.listen
app.listen(3000, function () {
console.log('app is running at port 3000.')
})

5. 基本路由

get:

//当你以 GET 方法请求 / 的时候,执行对应的处理函数
app.get('/',function(req,res){
res.send('GET Request')
})

post:

//当你以 POST 方法请求 / 的时候,执行对应的处理函数
app.post('/',function(req,res){
res.send('POST Request')
})

静态服务:

//写法一:
// 当省略第一个参数的时候,则可以通过 省略 /public 的方式来访问
// 这种方式的好处就是可以省略 /public/
app.use(express.static('public'))
app.use(express.static('./static/'))
//写法二:
app.use('/public/', express.static('./public/'))
app.use('/static/', express.static('./static/'))

开发公共目录(静态服务)栗子:

var express = require('express')
var app = express()
// 公开指定目录
// 只要这样做了,你就可以直接通过 /public/xx 的方式访问 public 目录中的所有资源了
app.use('/public/', express.static('./public/'))
app.use('/static/', express.static('./static/')) app.get('/', function (req, res) {
res.send('Hello World!')
})
// 4. 相当于 server.listen
app.listen(3000, function () {
console.log('app is running at port 3000.')
})

项目结构:

来吧展示:



/public/ /abc/d/ 的区别

app.use('/public/', express.static('./public/'))

app.use('/abc/d/', express.static('./public/'))



总结:

当以 /public/ 开头的时候,去 ./public/ 目录中找找对应的资源

这种方式更容易辨识,推荐这种方式

app.use('/public/', express.static('./public/'))

二、使用nodemon工具自动重启服务

  • nodemon可以帮助我们解决频繁修改代码重启服务器的问题

  • nodemon是一个基于Node.js开发的一个第三方命令行工具。我们在使用的时候需要独立安装

  • 安装

$ npm install --global nodemon

该命令在任意目录下执行都可以

  • 使用
$ node app.js

 #使用nodemon执行命令
$ nodemon app.js

只要使用nodemon 启动的服务,则它就会监视你的文件变化,当文件发生变化的时候,也就是当我们 ctrl + s保存文件时,就会自动帮助我们重启服务器

三、在Express中配置使用art-template模板引擎

art-template官方中文文档

安装

npm install --save art-template
npm install --save express-art-template
#或者同时安装两个包
npm install --save art-template express-art-template



使用

  1. 引入express包
var express  = require('express')
var app = express()
  1. 开发静态资源
app.use('/public',express.static('./public/'))
  1. 配置使用 art-template 模板引擎
app.engine('art', require('express-art-template'))

第一个参数,表示,当渲染以 .art 结尾的文件的时候,使用 art-template 模板引擎

express-art-template 是专门用来在 Express 中把 art-template 整合到 Express 中

虽然外面这里不需要记载 art-template 但是也必须安装

原因就在于 express-art-template 依赖了 art-template

  1. 响应页面
app.get('/', function (req, res) {
res.render('404.art')
})

Express 为 Response 相应对象提供了一个方法:render

render 方法默认是不可以使用,但是如果配置了模板引擎就可以使用了

res.render('html模板名', {模板数据})

第一个参数不能写路径,默认会去项目中的 views 目录查找该模板文件

也就是说 Express 有一个约定:开发人员把所有的视图文件都放到 views 目录中

如果想要修改默认的 views 目录,则可以

app.set('views', render函数的默认路径)

页面会报错的栗子:

var express  = require('express')
var app = express()
app.use('/public',express.static('./public/'))
app.engine('art', require('express-art-template'))
app.get('/', function (req, res) {
res.render('404.html')
})
app.listen(3000, function () {
console.log('running...')
})



解决方法一:

404.html文件的文件名更改成404.art

并且将 res.render('404.html') 更改成 res.render('404.art')

解决办法二:

engine()方法中的第一个参数art更换成html

app.engine('html', require('express-art-template'))
app.get('/', function (req, res) {
res.render('404.html')
})

页面响应正常的栗子:

var express  = require('express')
var app = express()
app.use('/public',express.static('./public/'))
app.engine('art', require('express-art-template'))
app.get('/', function (req, res) {
res.render('404.html')
})
app.listen(3000, function () {
console.log('running...')
})

四、使用Express重写留言本案例(只使用GET方式)

var express  = require('express')
var app = express()
app.use('/public',express.static('./public/'))
app.engine('html', require('express-art-template'))
var comments = [{
name: '张三',
message: '今天天气不错!',
dateTime: '2015-10-16'
},
{
name: '张三2',
message: '今天天气不错!',
dateTime: '2015-10-16'
},
{
name: '张三3',
message: '今天天气不错!',
dateTime: '2015-10-16'
},
{
name: '张三4',
message: '今天天气不错!',
dateTime: '2015-10-16'
},
{
name: '张三5',
message: '今天天气不错!',
dateTime: '2015-10-16'
}
]
app.get('/', function (req, res) {
res.render('index.html', {
comments: comments
})
}) app.get('/post', function (req, res) {
res.render('post.html')
})
app.get('/pinglun', function (req, res) {
var comment = req.query
comment.dateTime = '2020-10-10'
comments.unshift(comment)
res.redirect('/')
//在express也可以写http的原生语法
// res.statusCode = 302
// res.setHeader('Location', '/')
})
app.listen(3000, function () {
console.log('running...')
})

五、在Express中配置解析表单POST请求体数据

在Express中没有内置获取表单POST请求体的API,这里我们需要使用一个第三方包:body-parser

Express body-parse官方文档

安装

$ npm install body-parser

配置

var express = require('express')
var bodyParser = require('body-parser')
var app = express()
//只要加入这个配置,则在req请求对象上多出一个属性:body
//也就是说可以直接通过req.body来获取post请求的数据了
app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json()) app.post('/login', function (req, res) {
res.send('welcome, ' + req.body.username)
})
app.post('/api/users', function (req, res) {
// create user in req.body
})

把post.html中的form表单元素的method方式更改成post

当以post请求/pinglun时,req.body打印的结果就是表单中填写的值

app.post('/pinglun', function (req, res) {
console.log(req.body)
})

六、使用Express重写留言本案例(使用GET方式和POST方式)

var express  = require('express')
var app = express()
var bodyParser = require('body-parser')
app.use('/public',express.static('./public/'))
app.engine('html', require('express-art-template'))
app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json())
var comments = [{
name: '张三',
message: '今天天气不错!',
dateTime: '2015-10-16'
},
{
name: '张三2',
message: '今天天气不错!',
dateTime: '2015-10-16'
},
{
name: '张三3',
message: '今天天气不错!',
dateTime: '2015-10-16'
},
{
name: '张三4',
message: '今天天气不错!',
dateTime: '2015-10-16'
},
{
name: '张三5',
message: '今天天气不错!',
dateTime: '2015-10-16'
}
] app.get('/', function (req, res) {
res.render('index.html', {
comments: comments
})
})
app.get('/post', function (req, res) {
res.render('post.html')
})
// app.get('/pinglun', function (req, res) {
// var comment = req.query
// comment.dateTime = '2020-10-10'
// comments.unshift(comment)
// res.redirect('/')
// //在express也可以写http的原生语法
// // res.statusCode = 302
// // res.setHeader('Location', '/')
// }) app.post('/pinglun', function (req, res) {
var comment = req.body
comment.dateTime = '2017-11-5 10:58:51'
comments.unshift(comment)
res.redirect('/')
})
app.listen(3000, function () {
console.log('running...')
})

Node.js学习笔记----day04的更多相关文章

  1. 一点感悟:《Node.js学习笔记》star数突破1000+

    写作背景 笔者前年开始撰写的<Node.js学习笔记> github star 数突破了1000,算是个里程碑吧. 从第一次提交(2016.11.03)到现在,1年半过去了.突然有些感慨, ...

  2. Node.js学习笔记(3):NPM简明教程

    Node.js学习笔记(3):NPM简明教程 NPM常用操作 更新NPM版本 npm install npm -g -g,表示全局安装.我们可以指定更新版本,只需要在后面填上@版本号即可,也可以输入@ ...

  3. 系列文章--Node.js学习笔记系列

    Node.js学习笔记系列总索引 Nodejs学习笔记(一)--- 简介及安装Node.js开发环境 Nodejs学习笔记(二)--- 事件模块 Nodejs学习笔记(三)--- 模块 Nodejs学 ...

  4. Node.js学习笔记(2):基本模块

    Node.js学习笔记(2):基本模块 模块 引入模块 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式.在No ...

  5. Node.js学习笔记(1):Node.js快速开始

    Node.js学习笔记(1):Node.js快速开始 Node.js的安装 下载 官方网址:https://nodejs.org/en/ 说明: 在Windows上安装时务必选择全部组件,包括勾选Ad ...

  6. Node.js学习笔记(4):Yarn简明教程

    Node.js学习笔记(4):Yarn简明教程. 引入Yarn NPM是常用的包管理工具,现在我们引入是新一代的包管理工具Yarn.其具有快速.安全.可靠的特点. 安装方式 使用npm工具安装yarn ...

  7. Node.js学习笔记(一)

    1.回调函数 node是一个异步事件驱动的平台,所以在代码中我们经常需要使用回调函数. 例: setTimeout(function(){ console.log('callback is calle ...

  8. Node.js学习笔记(一):快速开始

    最近接了一个node项目,虽然最后顺利完成了,但是由于第一次实战,整个过程是赶出来的,许多地方一知半解.现在项目结束了,就静下心来系统地学一学,理一理,读书不忘拿笔,既然读书了,当然就要记点东西.一方 ...

  9. Node.js学习笔记(一)基础介绍

    什么是Node.js 官网介绍: Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine. Node.js us ...

  10. node.js学习笔记(三)——事件循环

    要理解事件循环,首先要理解事件驱动编程(Event Driven Programming).它出现在1960年.如今,事件驱动编程在UI编程中大量使用.JavaScript的一个主要用途是与DOM交互 ...

随机推荐

  1. xlwings 模块总结

    基本使用 在子线程中使用时,有时需要在子线程函数中加入以下.有时不需要加入,目前还不明白具体的原因 import pythoncom # 导入的库 pythoncom.CoInitialize() # ...

  2. linux系统启动达梦迁移工具失败解决办法

    在达梦数据库服务端的tool目录下执行./dts来启动迁移工具,迁移工具启动前出现报错,以下提供几种遇到问题的解决办法: 1. 报错1: 执行./dts,报错提示: [yyuser@qy-ggyf-z ...

  3. 一个基于角色的访问控制(RBAC)的简单示例

    关于"基于角色的访问控制"是什么,本文不再赘述,如果不明白,请自行查阅资料了解. 本文参考用户·角色·权限·表的设计的思想设计. 本文用到的技术有Spring Boot.Sprin ...

  4. C#pictureBox滚轮缩放与拖拽

    [转载]C#pictureBox滚轮缩放与拖拽 [转载]C#中图像平移.缩放的实现技巧 [转载]c# 通过鼠标拖动.放大图片,GDI绘图通过鼠标拖动.放大

  5. perl文件操作

    Perl 文件操作 Perl 使用一种叫做文件句柄类型的变量来操作文件. 从文件读取或者写入数据需要使用文件句柄. 文件句柄(file handle)是一个I/O连接的名称. Perl提供了三种文件句 ...

  6. Go语言核心36讲15---结构体

    我们都知道,结构体类型表示的是实实在在的数据结构.一个结构体类型可以包含若干个字段,每个字段通常都需要有确切的名字和类型. 前导内容:结构体类型基础知识 当然了,结构体类型也可以不包含任何字段,这样并 ...

  7. c#入参使用引用类型为啥要加ref?

    摘一段来自官网的说明 :方法的参数列表中使用 ref 关键字时,它指示参数按引用传递,而非按值传递. ref 关键字让形参成为实参的别名,这必须是变量. 换而言之,对形参执行的任何操作都是对实参执行的 ...

  8. <四>虚函数 静态绑定 动态绑定

    代码1 class Base { public: Base(int data=10):ma(data){ cout<<"Base()"<<endl; } v ...

  9. C# Math 中的常用的数学运算

    〇.动态库 System.Math.dll 引入动态库 using System.Math;   Math 为通用数学函数.对数函数.三角函数等提供常数和静态方法,使用起来非常方便,下边简单列一下常用 ...

  10. 【Shell脚本案例】案例1:服务器系统配置初始化

    〇.目录 一.背景 新购买10台服务器,并安装Linux系统 目的:对操作系统进行配置的初始化 二.需求 1.设置时区并同步时间 2.禁用selinux安全机制 3.关闭防火墙(清空防火墙的默认策略, ...