Nodejs--基础

45 阅读3分钟
  • Nodejs是基于Chrome V8引擎的JavaScript运行环境(后端)
  • 浏览器是Javascript前端运行环境
  • 为什么JavaScript可以操作DOM,BOM? => 浏览器内置了DOM,BOM的API,浏览器为运行环境(前端)

fs文件系统模块

读取文件 fs.readFile(path, [options,] callback)

path: 文件路径;options:可选参数 编码格式;callback:文件读取完成后,回调函数拿到结果

   const fs = require('fs');
   fs.readFile('./1.txt', 'utf8', function (err, data) {
      if (err) { //读取成功 err为null
      return console.log('读取文件失败', err);
    }
   console.log(data) //data为内容 ,若失败,data-undefined
  })

写入内容 fs.writeFile(filepath, data, [options,] callback)

  • 只能创建文件,不能创建路径

  • 写入同一个文件,内容会覆盖

     fs.writeFile('./成绩form.txt', str, 'utf8', function (err) {
      if (err) {
          console.log('写入失败')
      }
      console.log('写入成功')
     })
    
  • 拼接路径时,会以当前执行node命令所处的路径,拼接传入的相对路径;或可以直接一个完整路径

  • __dirname 表示当前文件所处的目录

path路径模块

拼接路径 path.join([...paths])多个路径片段拼接成一个路径

__dirname 表示当前的文件路径

  const pathstr = path.join('/a', '/b/c', '../', '/d'); // ../会抵消一层
  console.log(pathstr) // \a\b\d

  fs.readFile(path.join(__dirname, './1.txt'), 'utf8', function (err, data) {
   console.log(data)
  })

path.basename(path, [ext])获取路径中最后一部分,通常获取文件名

  const fpath = path.basename('a/b/c/index.html', '.html');
  console.log(fpath) // index

path.extname() 获取文件拓展名

http模块

服务器相关

  • IP地址,每台计算机唯一标识
  • 域名,和IP一一对应
  • 端口号 一个服务器可以运行多个web服务,端口号对应不同web服务

创建web服务器

const http = require('http');
//创建服务器实例
const server = http.createServer();
//绑定request事件,监听请求
server.on('request', function (req, res) { // 客户端通过浏览器请求服务器,就会触发,本地访问127.0.0.1
   console.log('visit')
 })
// 启动服务器
server.listen(80, function () {
  console.log('running')
})

req请求对象 res响应对象

 server.on('request',(req, res)=> {
   const url = req.url;
   const method = req.method;
   const str = `请求的url 是 ${url}, method 是 ${method}`
   //res.end 向客户端响应内容
   res.setHeader('content-type', 'text/html; charset=utf-8') //中文乱码问题
   res.end(str) 
   // str会显示在浏览器页面
 })

根据不同url返回不同内容

server.on('request', (req, res) => {
const url = req.url;
let content = '<h1>404 not found</h1>';
if (url === '/' || url === '/index.html') {
    content = '<h1>首页</h1>'
} else if (url === '/about.html') {
    content = '<h1>关于</h1>'
}
res.end(content)
})

根据请求读取本地文件 并返回

server.on('request', (req, res) => {
const url = req.url;
const pathstr = path.join(__dirname, '../source', url)
fs.readFile(pathstr, (err, data) => {
    res.end(data)
})
})   

image.png

如果读取的内容中,有对其他文件的引用,也会请求 image.png

模块化

  • 使用require()加载其他模块时,会执行被加载模块的代码

模块作用域 -- 防止全局污染

和函数作用域类似,模块中的变量方法,只能在当前模块内被访问

  1. module对象,存储了当前模块的信息

  2. module.exports对象,将模块内成员共享出去,使用require方法导入模块,得到的是moudule.exports指向的对象, 可简写为exports

  3. require()模块时,得到的永远是module.exports指向的对象

    exports.username = 'aa';
    module.exports = {
       name:'bb',
       age:18
    }
    得到的是{ name:'bb', age:18}
    

CommonJS模块化规范

  1. 模块内部,module变量代表当前模块
  2. module是一个对象,exports属性是对外接口
  3. require()加载模块,就是加载module.exports属性

npm 和包

nodejs中,分为内置模块,自定义模块,第三方模块, 第三方模块又称为包,npm为包管理工具