node.js(2)

简介: 简介什么是模板化将一个复杂的程序文件依据一定规则(规范)拆分成多个文件的过程称之为 模块化好处下面是模块化的一些好处:防止命名冲突高复用性高维护性暴露数据如何暴露两种方式

文章目录


模板化

简介

什么是模板化

将一个复杂的程序文件依据一定规则(规范)拆分成多个文件的过程称之为 模块化

好处

下面是模块化的一些好处:


防止命名冲突


高复用性


高维护性


暴露数据

如何暴露

//声明函数
function tiemo(){
  console.log('贴膜....');
}
//暴露数据
module.exports = tiemo;
//导入模块
const tiemo = require('./me.js');
//调用函数
tiemo(); //=> 贴膜....

两种方式

module.exports = value

exports.name = value



导入模块

在模块中使用 require 传入文件路径即可引入文件

const test = require('./me.js')

require 使用的一些注意事项:


对于自己创建的模块,导入时路径建议写 相对路径,且不能省略 ./ 和 …/


js 和 json 文件导入时可以不用写后缀,c/c++编写的 node 扩展文件也可以不写后缀,但是一般用不到,直接使用 node 的

require() 方法即可将 JSON 文件转换成 JS 对象


如果导入其他类型的文件,会以 js 文件进行处理


如果导入的路径是个文件夹,则会 首先 检测该文件夹下 package.json 文件中 main 属性对应的文件,


如果存在则导入,反之如果文件不存在会报错。


如果 main 属性不存在,或者 package.json 不存在,则会尝试导入文件夹下的 index.js 和 index.json,


如果还是没找到,就会报错


导入 node.js 内置模块时,直接 require 模块的名字即可,无需加 ./ 和 …/

导入模块流程

1.将相对路径转为绝对路径,定位目标文件

2.缓存检测

3.读取目标文件代码

4.包裹为一个函数并执行(自执行函数)。通过 arguments.callee.toString() 查看自执行函数

5.缓存模块的值

6.返回 module.exports 的值

function require(file){
  //1. 将相对路径转为绝对路径,定位目标文件
  let absolutePath = path.resolve(__dirname, file);
  //2. 缓存检测
  if(caches[absolutePath]){
    return caches[absolutePath];
  }
  //3. 读取文件的代码
  let code = fs.readFileSync(absolutePath).toString();
  //4. 包裹为一个函数 然后执行
  let module = {};
  let exports = module.exports = {};
  (function (exports, require, module, __filename, __dirname) {
    const test = {
      name: '尚硅谷'
    }
    module.exports = test;
    //输出
    console.log(arguments.callee.toString());
  })(exports, require, module, __filename, __dirname)
  //5. 缓存结果
  caches[absolutePath] = module.exports;
  //6. 返回 module.exports 的值
  return module.exports;
}

express

介绍


简单来说,express 是一个封装好的工具包,封装了很多功能,便于我们开发 WEB 应用(HTTP 服务)

使用


下载

npm init
npm i express

使用

//1. 导入 express
const express = require('express');
//2. 创建应用对象
const app = express();
//3. 创建路由规则
app.get('/home', (req, res) => {
  res.end('hello express server');
});
//4. 监听端口 启动服务
app.listen(3000, () =>{
  console.log('服务已经启动, 端口监听为 3000...');
});

路由

介绍


路由确定了应用程序如何响应客户端对特定端点的请求


使用

//导入 express
const express = require('express');
//创建应用对象
const app = express();
//创建 get 路由
app.get('/home', (req, res) => {
  res.send('网站首页');
});
//首页路由
app.get('/', (req,res) => {
  res.send('我才是真正的首页');
});
//创建 post 路由
app.post('/login', (req, res) => {
  res.send('登录成功');
});
//匹配所有的请求方法
app.all('/search', (req, res) => {
  res.send('1 秒钟为您找到相关结果约 100,000,000 个');
});
//自定义 404 路由
app.all("*", (req, res) => {
  res.send('<h1>404 Not Found</h1>')
});
//监听端口 启动服务
app.listen(3000, () =>{
  console.log('服务已经启动, 端口监听为 3000');
})

获取请求参数

//导入 express
const express = require('express');
//创建应用对象
const app = express();
//获取请求的路由规则
app.get('/request', (req, res) => {
  // 1. 获取报文的方式与原生 HTTP 获取方式是兼容的
  console.log(req.method);
  console.log(req.url);
  console.log(req.httpVersion);
  console.log(req.headers);
    // 2. express 独有的获取报文的方式
    // 获取路径
  console.log(req.path)
    //获取查询字符串
  console.log(req.query); // 『相对重要』对象形式返回所有的查询字符串
  // 获取指定的请求头
  console.log(req.get('host'));
  res.send('请求报文的获取');
});
//启动服务
app.listen(3000, () => {
  console.log('启动成功....')
})

获取路由参数

app.get('/:id.html', (req, res) => {
  res.send('商品详情, 商品 id 为' + req.params.id);
});

响应设置

//获取请求的路由规则
app.get("/response", (req, res) => {
    //1. express 中设置响应的方式兼容 HTTP 模块的方式
    res.statusCode = 404;
    res.statusMessage = 'xxx';
    res.setHeader('abc','xyz');
    res.write('响应体');
    res.end('xxx');
    //2. express 的响应方法
    res.status(500); //设置响应状态码
    res.set('xxx','yyy');//设置响应头
    res.send('中文响应不乱码');//设置响应体
    //连贯操作
    res.status(404).set('xxx','yyy').send('你好朋友')
    //3. 其他响应
    res.redirect('http://atguigu.com')//重定向
    res.download('./package.json');//下载响应
    res.json();//响应 JSON
    res.sendFile(__dirname + '/home.html') //响应文件内容
});

中间件

介绍

中间件(Middleware)本质是一个回调函数

中间件函数 可以像路由回调一样访问 请求对象(request) , 响应对象(response)

作用

中间件的作用 就是 使用函数封装公共操作,简化代码

类型

定义全局中间件

let recordMiddleware = function(request,response,next){
  //实现功能代码
  //.....
  //执行next函数(当如果希望执行完中间件函数之后,仍然继续执行路由中的回调函数,必须调用next)
  next();
}
app.use(recordMiddleware)
app.use(function (request, response, next) {
    console.log('定义第一个中间件');
    next();
})

多个全局中间件

app.use(function (request, response, next) {
    console.log('定义第一个中间件');
    next();
})
app.use(function (request, response, next) {
    console.log('定义第二个中间件');
    next();
})

路由中间件

app.get('/路径',`中间件函数`,(request,response)=>{
});
app.get('/路径',`中间件函数1`,`中间件函数2`,(request,response)=>{
});

资源中间件

//引入express框架
const express = require('express');
//创建服务对象
const app = express();
//静态资源中间件的设置,将当前文件夹下的public目录作为网站的根目录
app.use(express.static('./public')); //当然这个目录中都是一些静态资源
//如果访问的内容经常变化,还是需要设置路由
//但是,在这里有一个问题,如果public目录下有index.html文件,单独也有index.html的路由
//则谁书写在前,优先执行谁
app.get('/index.html',(request,response)=>{
  respsonse.send('首页');
});
//监听端口
app.listen(3000,()=>{
  console.log('3000 端口启动....');
});


接口


简介


接口是 前后端通信的桥梁


RESTful API

json-server

1.全局安装 json-server

npm i -g json-server

2.创建 JSON 文件(db.json),编写基本结构

{
  "song": [
    { "id": 1, "name": "干杯", "singer": "五月天" },
    { "id": 2, "name": "当", "singer": "动力火车" },
    { "id": 3, "name": "不能说的秘密", "singer": "周杰伦" }
  ]
}

以 JSON 文件所在文件夹作为工作目录,执行如下命令

json-server --watch db.json



目录
相关文章
|
1月前
|
JavaScript 前端开发 开发工具
Node.js——初识Node.js
Node.js——初识Node.js
32 4
|
JSON 前端开发 JavaScript
Node.Js(二)
Node.Js
77 0
|
JavaScript 前端开发
初学Node.Js
初学Node.Js
65 0
|
Web App开发 JavaScript 前端开发
Node.js 是什么?
Node.js 是什么?
|
JSON JavaScript 前端开发
Node.js Next 10
Node.js Next 10
|
存储 Web App开发 JSON
一篇文章带你看懂Node.js
一篇文章带你看懂Node.js
178 0
一篇文章带你看懂Node.js
|
JavaScript 前端开发 Java
Node.js的特点是什么
《前端基础》
138 0
|
缓存 运维 JavaScript
狼叔:聊聊 Node.js
前阵子我在知乎上回答了《2021前端会有什么新的变化?》,单篇33.8万的阅读量,还是不错的,说明大家非常关心前端的变化趋势,这里再与大家分享一下我对 Node.js 相关内容的看法。
狼叔:聊聊 Node.js
|
JavaScript API 前端开发
Node.js - What's next
来自 Node.js 技术委员会(TSC)主席 Michael Dawson 在 D2 的分享,Node.js 工作组正在做的事情及未来规划。
Node.js - What's next
|
机器学习/深度学习 Kubernetes JavaScript
Node.js 要完了吗?
不管你输入的是哪种技术都可以搜出来一大堆文章来,其中很多无疑写的就是垃圾。就算是 Kubernetes 之类的新技术也不能幸免,Node.js 自然也不例外。