1,如何创建一个最简单的服务器?**
原生:
// 1. 导入 http 模块
const http = require('http')
// 2. 创建 web 服务器实例
const server = http.createServer()
// 3. 为服务器实例绑定 request 事件,监听客户端的请求
server.on('request', function (req, res) {
console.log('Someone visit our web server.')
})
// 4. 启动服务器
server.listen(8080, function () {
console.log('server running at http://127.0.0.1:8080')
})
这样我们就可以用本机在浏览器通过http://127.0.0.1:8080 地址进行访问服务器了;
通过 express模块:
// 1. 导入 express
const express = require('express')
// 2. 创建 web 服务器
const app = express()
// 4. 监听客户端的 GET 和 POST 请求,并向客户端响应具体的内容
app.get('/user', (req, res) => {
// 调用 express 提供的 res.send() 方法,向客户端响应一个 JSON 对象
res.send({ name: 'zs', age: 20, gender: '男' })
})
// 3. 启动 web 服务器
app.listen(80, () => {
console.log('express server running at http://127.0.0.1')
})
通过 服务器实例app可以使用.get监听客户端的get请求行为,使用.post来监听客户端的post请求行为;
通过res.send()方法可以向客户端响应内容,注意,返回的对象格式的数据达到服务器时为json格式;
通过 第三方模块 express可以更简单的创建一个服务器,这样,本机访问http://127.0.0.1地址是就会得到服务器的返回信息:{ name: ‘zs’, age: 20, gender: ‘男’ };
2,nodejs中的模块,如何将模块中的方法供外界使用?
通过require()方法可以导入模块,包括内置模块http,path,fs自定义模块(用户根据需求,自己写的模块)和第三方模块(别人写好的可以处理不同问题的模块), 在nodejs中第三方模块又叫做包
通过导入这些包我们可以实现快速开发;
⚫ 内置模块(内置模块是由 Node.js 官方提供的,例如 fs、path、http 等)
⚫ 自定义模块(用户创建的每个 .js 文件,都是自定义模块)
⚫ 第三方模块(由第三方开发出来的模块,并非官方提供的内置模块,也不是用户创建的自定义模块,使用前需要先下载)
在nodejs中,每一个模块都有一个独立的作用域,作用域外无法访问作用域内的内容;其好处是防止了全局变量污染的问题;
那么模块内封装的方法如何供外界使用呢?
每一个.js自营一模块中都有一个moudle对象,里面的exports对象中存储了外界可以使用的成员,
所以,我们可以通过module,exports={ 成员},将方法暴露出去,其他的js文件通过require导入该模块就可以使用这个成员的方法了;
举例:
module.exports = {
nickname: '小黑',
sayHi() {
console.log('Hi!')
}
}
这样就将nickname这个变量,和sayhi这个方法暴露出去了;
可知 m中就包含了小黑,和sayhi这个方法,m.sayhi就可以直接调用;
3,什么是路由?
从广义上来讲,路由就是映射关系;
在 Express 中,路由指的是客户端的请求与服务器处理函数之间的映射关系。
Express 中的路由分 3 部分组成,分别是请求的类型、请求的 URL 地址、处理函数,格式如下:
app.method(path,handler)
当请求类型和请求地址可以匹配的时候,就会触发对应的事件处理函数;
举例;
// 挂载路由
//post 请求
app.get('/', (req, res) => {
res.send('hello world.')
})
//get请求
app.post('/', (req, res) => {
res.send('Post Request.')
})
4,单一模块化路由
为了使达到功能更加单一以及方便后期维护的目的,常常进行模块化;把不同功能的代码分开,例如;一个js文件只做服务器的启动;,另一个js文件仅挂载路由,不同的事件处理函数再使用不同的js文件来处理,这样我们在修改的时候,只修改单一的代码就可以了;
4.1 服务器启动
const express = require('express')
const app = express();
//app.use() 用来注册全局中间件
// '/api'为访问前缀
app.use('/api', require('./router/user'))
app.use('/home', require('./router/home'))
app.use('/admin', require('./router/admin'))
app.listen(3000, () => {
console.log('http://127.0.0.1:3000')
});
//这个页面只做服务器的启动
4.2 挂载路由(仅admin模块):
//admin模块
// 路由模块
//1导入express
var express = require('express')
//2创建路由对象
var router = express.Router()
//3挂载具体路由
router.get('/list', require('../controller/admin'))
//4向外导出路由
module.exports = router
//这个界面做 路由的挂载
4.3: 具体业务逻辑处理函数:
//admin.js
module.exports = (req, res) => {
res.send('admin page')
}
//home.js
module.exports = (req, res) => {
res.send('home page')
}
//add.js
module.exports = (req, res) => {
res.send('add new user ')
}
//list.js
module.exports = (req, res) => {
res.send('get user list')
}
//业务逻辑的处理
这样一来,如果我们想修改添加信息界,仅仅需要修改add.js中的文件就可以了,不需要更改其他的东西;方便了许多;
5,中间件
中间件(Middleware ),特指业务流程的中间处理环节。
express中间键的调用流程:
当一个请求到达 Express 的服务器之后,可以连续调用多个中间件,从而对这次请求进行预处理;
express的中间件本质上是一个function处理函数:格式为
app.use((req, res, next) => {
console.log('第一个中间件');
next();
})
使用中间件后,必须调用next函数,将流转关系转交给下一个中间件或者 函数
举例:
const express = require('express')
const app = express();
let flag = false
app.use((req, res, next) => {
if (flag) {
res.send('正在维护')
} else {
console.log('第一个中间件');
next();
}
})
app.get('/', (req, res) => {
res.send('Home')
})
app.listen(3000)
console.log('http://127.0.0.1:3000');
当我们不想让客户端访问页面的时候,可以将flag的值设置为 true,这样客户端就不会访问到Home’页面,而是获取到中间件返回的"正在维护",反之,设置为false就可以正常访问页面;
中间件就是把用户的请求进行一次预处理;
注意:使用app.use注册的中间件所有的后续程序都要先经过这个中间件,当你想要给某个路由单独注册中间件时,可以以这种方式:
app.get('/user', mw1, (req, res) => {
console.log('这是路由');
res.send("User page.")
})
mw1为中间件,这样只有用户访问/user这个地址时,这个中间件才会生效;
待续`````````````