1.模块化

NodeJs基于Commonjs模块化开发的规范,它定义一个JS文件就称之为一个模块

导出: module.exports = {num: num}、exports.键 = 值

导入: require('./b.js')   .js 后缀可以省略不写

对比ES6模块化的导入导出:export导出 / import导入

2.运行js文件

node a.js :以 node 这个 "软件" 来运行 该 js 文件

常见cmd指令:

  • cd :切换到指定目录下(不可切换盘符,tab按键可以快速切换目录,补齐目录名)
  • cd.. :回到上一级目录
  • 盘符: 切换盘符
  • dir :当前目录下有哪些文件或文件夹
  • md 文件名:创建文件夹
  • rmdir 文件夹名:删除文件夹
  • cls、clear:清屏
  • ipconfig: 查看电脑ip地址信息
  • systeminfo:查看操作系统信息

3.1内置模块fs:对文件和文件夹的操作处理(file system)

const fs = require('fs') 引入fs模块

fs.readFile(文件路径, 'utf8’, (err,data) => {})  :异步读取文件内容,格式默认 buffer, 常用'utf-8'

fs.readFileSync(文件路径, 格式):同步读取文件内容,返回读取到的文件内容

fs.writeFile(文件路径,写入的内容,err => {}): 异步写入文件内容,文件存在会覆盖内容,文件不存在会创建一个新文件

fs.writeFileSync(文件路径,写入内容):同步写入文件内容

fs.existsSync(path)  // 检查文件是否存在    返回true/false,(async为异步)

// 获取文件信息(异步)

fs.stat(文件,(err,stats) => {

        stats.isDirectory()  // 是否是目录(文件夹)

        stats.isFile()         // 是否为文件

        stats.size            // 文件大小(以字节为单位)

})

fs.unlink(文件路径,err => {}) // 删除文件(异步)

3.2内置模块path(处理文件的路径)

const path = require('path') :引入path模块

path.join('/a', 'b', 'c'),返回值: 组装好的是相对路径信息:/a/b/c

path.resolve("a", "../b", "c"), 返回值: 组装好的装成一个绝对路径信息

__filename:全局变量,当前正在执行的脚本的文件名(完整/绝对路径)

__dirname:全局变量,当前执行脚本所在的目录路径(目录的绝对路径)

不同的系统中路径的/不同,有时是\

path.basename('c:/a/b/c/d.html')  // 获取文件名称: d.html

path.dirname('c:/a/b/c/d.html') // 获取目录名:c:/a/b/c

path.extname('c:/a/b/c/d.html') // 获取路径中文件扩展名(后缀): .html

拼装文件绝对路径:path.resolve(__dirname, 'family.db');

3.3内置模块os:操作系统相关的方法和属性(operation system)

const os = require('os')  // 引入os模块

os.EOL: 根据不同的操作系统生成不同的换行符,window \r\n,linux下面 \n

os.cpus()  : cpu相关信息

os.totalmen() : 总内存大小(单位:字节)

os.freemem() : 空余内容大小

os.hostname() : 主机名

os.type() : 系统类型

3.4内置模块url:操作网址

const url = require('url')

url.parse(): 解析网址,解析成对象(协议、auth、hostname、port、qyery)

3.5内置模块querystring:用于解析和格式化url查询字符串,URL地址的get形式传参的实用工具

const querystring = require('querystring')

querystring.parse('foo=bar&abc=xyz') // 将query字符串转为对象

querystring.stringify({ foo: 'bar',abc: 'xyz'}) // 对象转为query字符串

querystring.decode('foo=bar&abc=xyz') // 将query字符串转为对象

querystring.encode({ foo: 'bar',abc: 'xyz'})  // 对象转为query字符串

类似JSON.parse()、JSON.stringify()

3.6内置模块hppt:用来开启 http 服务的(主流的三个Web服务器软件是Apache、 Nginx 、IIS)

DNS:做域名服务器,动态域名解析系统,作用将域名转化成IP地址

const http = require('http')  :导入hppt模块

const sever = http.createServer(函数) :创建web服务对象实例

sever.on('request',(request,response)=>{})

   // request: 接受客户端请求对象,它包含了与客户端相关的数据和属性

  • request.url      客户端请求的uri地址

  • request.method  客户端请求的方式 get或post

  • request.headers   客户端请求头信息(对象)

   // response:服务器对客户端的响应对象

  • response.setHeader('content-type', 'text/html;charset=utf-8') // 设置单个响应头信息 ,用于响应时有中文时乱码解决处理

  • response.setHeader(状态码,状态描述,{响应头信息}) // 可设置多个响应头信息 

  • response.statusCode = 200(默认是200)// 设置状态码(常见的HTTP状态码有:200,404,301、302、304、403、401、405、500,502)

  • response.end('hello world') // 向客户端发送响应数据,并结束本次请求的处理过程

sever.listen(8080, ()=>{}),:启动服务

// 1. 导入http模块
const http = require("http");

// 2. 创建web服务实例
const server = http.createServer();

// 3. 监听request请求
server.on("request", (req, res) => {
    // 输出hello world
    // res.end("hello world");
    if (req.url === "/") {
        res.end("hello world");
    }
    if (req.url === "/html5") {
        res.end("hello h5");
    }
});

// 4. 启动服务
server.listen(8080, () => {
    // 仅是提示作用,可以不写,但是建议写
    console.log("server is running at http://127.0.0.1:8080");
});

静态资源服务器::专门保存html、css、js、图片、音频、视频等服务器

const http = require("http");
const path = require("path");
const fs = require("fs");
//  创建web实例
const server = http.createServer();
//  监听request事件
server.on("request", (req, res) => {
    // 获取当前用户访问的资源路径
    let uri = req.url;
    // 由于“/”没有实体资源,需要将“/”做处理,如果访问“/”则让其对应访问“/index.html”
    if (uri == "/") {
        uri = "/index.html";
    }
    // 默认情况下,浏览器在第一次请求网站的时候会访问“/favicon.ico”图标文件,如果没有也会出现404
    // 如果需要解决这个问题,则有3种方式:
    // 方式1:去找个ico文件,存放在静态资源的public目录下,命名为“favicon.ico”
    // 方式2:在处理的时候忽略“/favicon.ico”文件的处理,也就是下面的加了判断的写法
    // 方式3:不管,不用处理,其不影响页面的显示
    if(uri != '/favicon.ico'){
        // 读取文件(fs模块),将内容返回给用户(res.end)
        let filename = path.join("public", uri);
        // 判断文件是否存在
        if (fs.existsSync(filename)) {
            fs.readFile(filename, (err, data) => {
                if (!err) {
                    // ok
                    res.end(data);
                } else {
                    // 不ok
                    res.setHeader("Content-Type", "text/html;charset=utf-8");
                    res.statusCode = 500;
                    res.end("请求资源出现错误。。。");
                }
            });
        } else {
            res.setHeader("Content-Type", "text/html;charset=utf-8");
            res.statusCode = 404;
            res.end("你要找的资源失踪了。。。");
        }
    }
});
//  监听端口,启动服务
server.listen(8080, () => {
    console.log("server is running at http://127.0.0.1:8080");
});

get接口获取数据

const http = require('http');

const url = require('url');

http.createServer((req, res) => {

let { query } = url.parse(req.url, true);

}).listen(8080)

post接口获取数据:需要监听req对象的data事件(接收请求提交过来的数据的)来获取客户端发送到服务器的数据。如果数据量比较大,无法一次性发送完毕,则客户端会把数据切割后分批次发送给服务器。每次触发data事件时,收到的数据只是全部数据的一部分,因此需要做数据的拼接才能得到完整的数据:

const http = require('http');

const queryString = require('querystring');

http.createServer((req, res) => {

    let arr = [];

    req.on('data', buffer => {

        arr.push(buffer);

    });

    // 数据传输结束了

    req.on('end', () => {

        // 拼接接受到的所有数据

        let buffer = Buffer.concat(arr);

        let post = queryString.parse(buffer.toString())

        console.log(post);

    });

}).listen(8080)

爬虫

http.get()

代理

const http = require('http')

// 下载并导入第三方模块http-proxy-middleware

const {createProxyMiddleware} = require 'http-proxy-middliware'

// 推荐方式1,需要在localhost:3000访问可成功代理

let fn =  createProxyMiddleware('/api,' {

        target: http://www.17989.com/xiaohua/', // 要代理的目标地址

        changeOrigin: true,  // 改变源头,必加

        // 最终的代理目标地址相当于target+自定义地址,比如'/api'

        // 是否从最终的目标地址中去掉或替换一部分

        pathRewrite: {

                '/api': ''

        }

})

// 方式2帮助理解,需要在localhost:3000/xiaohua/访问才能成功代理

let fn =  createProxyMiddleware('/xiaohua/,' {

        target: http://www.17989.com/xiaohua/',

        changeOrigin: true, 

})

const sever = http.createSever((req, res)=>{

        fn(req, res)

})

express:基于 Node.js 平台,快速、开放、极简的 Web 开发框架。是一个 npm 上的第三方包,提供了快速创建 Web 服务器的便捷方法。使用Express开发框架可以非常方便、快速的创建Web网站的服务器或API接口的服务器

下载 express: $ npm install express

下载 art-template(提供模板引擎解析语法):$ npm install art-template

下载 express-art-template(让 atr-template 和 express 合作): $ npm install express-art-template

const express = require('express')

// 创建服务
const app = express()

// 配置服务的静态资源
app.use('/public', express.static('./client'))

// 配置文件读取引擎(需要用到 expres-art-template)
app.engine('html', require('express-art-template'))

// 配置所有文件的处理
app.use('/page', (req, res) => {
  const path = req.url.slice(1)

  // 利用 express-art-template 提供的 res.rander 方法 去读取指定的文件内容
  // 注意: 文件需要放在 views 文件夹内
  res.render(path, { title: '啥都有 首页', list: [ 100, 200, 300, 400, 500 ] })
})

// 监听一个指定的端口号
app.listen(6060, () => console.log('监听 6060 端口号成功了'))

// 去到命令行, 用 node 执行当前文件

使用express处理静态资源

// 使用 express 框架搭建一个服务器
const express = require('express')
const fs = require('fs')

// 1. 创建服务
// 语法: express()
// 返回值: 一个服务
const app = express()

// 配置所有静态资源文件
// 我们把所有静态资源约定一个共同点, 当你需要静态资源文件的时候, 请求都以 /public 开头
//  将来前端需要 css/index.css 文件的时候, 就请求 /public/css/index.css
app.use('/public', express.static('./client'))

// 配置各种内容
// 目前已后端为主, 设计了一个 /a, 返回的是 index.html 文件
// 当前端需要 index.html 文件的时候, 请求 /a
// 这个是一个随便书写的内容, 完全没有语义化
// 既然可以自己定义, 修改成 /index.html
app.use('/index.html', function (req, res) {
  fs.readFile('./client/index.html', 'utf-8', (err, data) => {
    if (err) return console.log(err)

    res.end(data)
  })
})

// 既然 index.html 可以成功
// 那么我们就可以把 xxx.html 放在一起书写
// 我们还可以把 xxx.css 放在一起书写
// 我们还可以把 xxx.js 放在一起书写
// 我们还可以把 xxx.jpg 放在一起书写
// ...

// 我们可以把上面的内容分成两类
// 1. 页面文件(html)
// 2. 静态资源(css, js, 图片)
// express 框架给我们提供了一个叫做 static 的方法
//   专门用来处理静态资源文件的
// 语法: express.static('文件夹名称')
// 作用: 按照你写的文件夹去自动查找内容自动帮你返回给前端


// 2. 监听一个端口
// 语法: 服务.listen(端口号, 回调函数)
app.listen(8080, () => console.log('监听8080 端口成功'))

/*
  // 将来只要前端发送 /public/xxx 的请求
  // 都会去到 ./client 文件夹下查找文件, 自动返回
  app.use('/public', express.static('./client'))

  // 例子:
  // 前端请求 /public/css/index.css
  // 拿到 /public 后面的内容, 也就是 /css/index.css
  // 和 ./client 组合在一起, 得到 ./client/css/index.css
  // 自动读取 ./client/css/index.css 文件, 返回给前端

  // 前端请求 /public/js/index.js
  // 拿到 /public 后面的内容, 也就是 /js/index.js
  // 和 ./client 组合在一起, 得到 ./client/js/index.js
  // 自动读取 ./client/js/index.js 文件, 返回给前端

  // 前端请求 /aaa/css/index.css
  // 不会去按照 static 规则定义了
*/

 nodemon 工具

专门用来执行 js 文件的工具,依赖 node 环境运行,当文件发生变化的时自动重启

npm install --global nodemon  // 下载

nodemon --version // 检测

npm uninstall --global nodemon // 卸载

nodemon 文件名称 // 执行js文件(和使用 node 运行 js 文件是一样的)

基础路由

const express = require('express')
const app = express()
// 配置服务的静态资源
app.use('/public', express.static('./client'))

// 配置文件读取引擎(需要用到 expres-art-template)
app.engine('html', require('express-art-template'))

// 配置所有文件的处理
app.use('/page', (req, res) => {
  const path = req.url.slice(1)

  // 利用 express-art-template 提供的 res.rander 方法 去读取指定的文件内容
  // 注意: 文件需要放在 views 文件夹内
  res.render(path, { title: '啥都有 首页', list: [ 100, 200, 300, 400, 500 ] })
})


// 判断你请求了什么内容, 我给出对应过得结果
// 两个基础语法
//   app.get('请求地址', 处理函数)
//   app.post('请求地址', 处理函数)
app.get('/aaa', (req, res) => {
  // res.end 只能返回一个 字符串 类型
  // const obj = {
  //   code: 1,
  //   message: '登录成功'
  // }
  // // 为了能把 obj 传递回去
  // // 需要 把 obj 转换成 字符串
  // // josn 格式
  // const str = JSON.stringify(obj)
  // res.end(str)
  // 当你使用 express 的时候, express 为你提供了一个方法叫做 send()
  // 你可以向里面填写任意数据类型, express 会自动判断你的数据类型, 决定要不要帮你转换成 字符串
  // res.send('hello world')

  res.send({ code: 1, message: '注册成功' })
})

app.post('/login', (req, res) => {
  // 拿到前段传递来的数据, 进行数据库比对, 告诉他登录成功失败

  res.send({
    code: 1,
    message: '我接收到你用 post 发送的 /login 请求了'
  })
})

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐