nodejs 入门基本操作

这篇具有很好参考价值的文章主要介绍了nodejs 入门基本操作。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

操作fs模块

const path = require("path");
const fs = require("fs");

/*
相对路径是命令窗口执行的目录
node 提供了path模块来操作路径相关的api, 其中__dirname是一个内置的变量,返回当前文件所在的目录
*/
const getDirUrl = dir => {
  return path.resolve(__dirname, dir);
};
for (let i = 0; i < 5; i++) {
  fs.writeFileSync(getDirUrl("./create01.text"), i + "、我是测试数据" + i + "\n", {
    flag: "a+",
    encoding: "utf-8"
  });
}

console.log("hello nodejs");

const data = fs.readFileSync(getDirUrl("./create01.text"), {encoding: 'utf-8'}).toString()
console.log('同步读取')
console.log(data)

console.log('异步读取')
fs.readFile(getDirUrl("./create01.text"), (err, data) => {
  if(!err) {
    console.log(data.toString());
  } else {
    console.error(err);
  }
});

在窗口执行对应的目录即可,我这里是:

nodejs 入门基本操作

操作http模块

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

const mimes = {
  html: "text/html",
  css: "text/css",
  js: "text/javascript",
  png: "image/png",
  jpg: "image/jpeg",
  gif: "image/gif",
  mp4: "video/mp4",
  mp3: "audio/mpeg",
  json: "application/json"
};
//2. 创建服务对象 create 创建 server 服务
// request 意为请求. 是对请求报文的封装对象, 通过 request 对象可以获得请求报文的数据
// response 意为响应. 是对响应报文的封装对象, 通过 response 对象可以设置响应报文
const server = http.createServer((req, res) => {
  let { url, method } = req; 
  // 文件夹路径
  const rootDir = __dirname + "/public";
    
  let filePath = rootDir + url;
  if (!fs.existsSync(filePath)) {
    return
  }
  // 读取内容
  fs.readFile(filePath, (err, data) => {
    if (err) {
      console.log(err);
      //设置字符集
      res.setHeader('content-type','text/html;charset=utf-8');
      //判断错误的代号
      switch(err.code){
        case 'ENOENT':
          res.statusCode = 404;
          res.end('<h1>404 Not Found</h1>');
        case 'EPERM':
          res.statusCode = 403;
          res.end('<h1>403 Forbidden</h1>');
        default:
          res.statusCode = 500;
          res.end('<h1>500 Internal Server Error</h1>');
      }
      return;
    }
    //获取文件的后缀名
    let ext = path.extname(filePath).slice(1);
    //获取对应的类型
    let type = mimes[ext];
    if(type){
      if(ext === 'html'){
        res.setHeader('content-type', type + ';charset=utf-8');
      }else{
        res.setHeader('content-type', type);
      }
    }else{
      //没有匹配到-默认设置二进制文件类型
      res.setHeader('content-type', 'application/octet-stream');
    }
    //响应文件内容
    res.end(data);
  });
});

//3. 监听端口, 启动服务
server.listen(9000, () => {
  console.log("服务已经启动,9000端口监听中...");
});

如上最简单的http 服务起来了,在浏览器中 输入 http://localhost:9000/index.html 得到如下页面

nodejs 入门基本操作

通过匹配后缀,在public文件中返回对应的资源,代码结构如下

nodejs 入门基本操作

都是一些很简单的代码就不贴了,如果需要留下邮箱即可。

其他模块看看官网的文档即可,不在记录。

框架

上面都是通过原始的方式来使用node,其实node的生态也很丰富,有很多的框架让我们选择,如 express、koa2、nestjs、midwayjs 等等

express 基本使用

// 1.0 导入express
const express = require('express')
// 2.0 express 实例
const app = express()
const port = 9000

// 3.0 路由
app.get('/', (req, res) => {
  res.send('基本使用 Hello World!')
})

// 启动服务
app.listen(port, () => {
  console.log(`启动服务,端口: ${port}`)
})

通常我们使用脚手架,这样可以得到统一的项目结构 如 express_ generator,具体查看express 官网

中间件-洋葱模型

  目前比较流行的 nodejs http 服务框架使用拦截器模式,这种模式将 http 请求响应的过程分为若干切面,每个切面上进行一项或若干项关联的操作。比如说,我们可以通过不同的拦截切面处理用户信息验证、会话(session)验证、表单数据验证、query 解析,或者业务逻辑处理等等。这种架构设计让切面与切面之间彼此独立。

有点面向切面编程的概念,不知道对不对。

手动实现一个拦截器:实现类似如下效果

async (ctx, next) => {
  do sth...
}

通过调用next 执行下一个函数,可以中途return退出,也可以继续调用next直到最后一个函数,然后在一层一层的返回,洋葱的结构跟这个类似,所以叫洋葱模型。

这里的中间件其实是一个函数,在外层使用use 注入进来。

nodejs 入门基本操作

执行第一个中间件的fn,调用next 进入到下一个中间件,继续执行下一个fn,调用next 友进入下一个中间件,继续重复上述逻辑,直至最后一个中间件,直至最后一个中间件,就会执行 next 语句后面的代码,然后继续上一个中间件的next后置语句,继续重复上述逻辑,直至执行第一个中间件的next后置语句,最后输出,这个执行的机制,称为洋葱模型
 

模拟洋葱模型

 洋葱模型关键在于怎么处理next 参数,next是下一个函数的引用, ,可以通过我们索引加闭包,或者累加器的形式来处理,为了方便直接使用累加器的形式即可,如下代码:

/*
  这个思路通过利用累加器函数的特性,返回一个函数
*/
class Interceptor {
  aspects = [];
  use (fn) {
    this.aspects.push(fn)
    return this
  }
  async run (context) {
    // 从右往左开始遍历
    const proc = this.aspects.reduceRight(
      function (a, b) {
        let flag = false
        return async () => {
          // a 上一个fn,也就是调用的时传入的 next
          if (flag) {
            return
          }
          flag = true
          await b(context, a)
        }
    },() => Promise.resolve())
    try {
      // 通过这个reduceRight 让函数串起来了
      await proc()
    } catch (e) {
      console.error(e);
    }
  }
}

// 测试
const inter = new Interceptor()
inter.use(function a(context, next) {
  console.log("a");
  next();
  console.log("a_after");
});
inter.use(function b(context, next) {
  console.log("b");
  next();
  console.log("b_after");
});
inter.use(function c(context, next) {
  console.log("c");
  next();
  console.log("c_after");
});
inter.use(function d(context, next) {
  console.log("d");
  next();
  console.log("d_after");
});
inter.run();

输出a、b、c、d、d_after、c_after、b_after、a_after 其中koa2 源码中使用了索引加闭包的形式来处理 源码

nodejs 入门基本操作

小结

  理解了nodejs 写起来还是挺顺手的,官网文档也还好。至于其他如sql路由保持会话状态等后台基本知识点,看看相关文档即可,并没有什么难度。

  nodejs 入门基本也结束了。文章来源地址https://www.toymoban.com/news/detail-445789.html

到了这里,关于nodejs 入门基本操作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • TensorFlow入门(十一、图的基本操作)

    建立图         一个TensorFlow程序默认是建立一个图的,除了系统自动建图以外,还可以用tf.Graph()手动建立,并做一些其他的操作         如果想要获得程序一开始默认的图,可以使用tf.get_default_graph()函数         如果想要重新建立一张图代替原来的图,可以使用tf.reset_default_gr

    2024年02月07日
    浏览(29)
  • 快速入门Maxwell基本操作流程(3D部分)

    作者:金广林 第一步:建模 先绘制出五边形(截面) 再绘制框线的路径 将四段框线合并 (全选中后unite) 选中路径和截面,Draw- sweep- along path(让截面沿着路径扫过) 确定之后模型如图所示  添加材料    双击后点击edit,挑一个材料 这里选了铜copper 第二步:添加激励源 首

    2024年02月06日
    浏览(57)
  • 【Linux】基本指令-入门级文件操作(二)

    目录 基本指令 7 cp指令(重要) 8  mv指令(重要) 9 nano指令  10 cat指令 11 echo指令与重定向(重要) 12 more指令 13 less指令 功能:复制文件或目录(copy) 语法:cp [选项] 源文件或目录 目标文件或目录 常用选项: -f        强制复制源文件或目录到目标文件,不管目标文件

    2024年02月08日
    浏览(39)
  • 【Linux】基本指令-入门级文件操作(一)

    目录 前言 ⭕linux的树状文件结构 ⭕绝对路径和相对路径 ⭕当前路径和上级路径 ⭕隐藏文件 基本指令(重点) 1 pwd 指令 2 mkdir 指令  3 touch 指令 4 ls 指令 4.1 ls只加选项不加文件/目录名,默认查看当前目录下的文件 4.1.1 ls -a:查看所有文件包括隐藏文件 4.1.2 ls -l / ll:

    2024年02月08日
    浏览(32)
  • Docker入门安装、镜像与容器下载 —— 基本操作

    目录 前言 Docker 1. docker介绍 2. docker安装 3. docker基本使用 3.1 镜像下载 3.2 操作容器         虚拟机:基于主机(物理机或虚机)的多服务实例。 在该模式下,软件开发人员可以提供单个或多个物理机或虚机,同时在每个主机上运行多个服务实例。 此模式有几种不同的实现形式

    2024年01月17日
    浏览(64)
  • 【SQL server】数据库入门基本操作教学

    个人主页:【😊个人主页】 系列专栏:【❤️初识JAVA】 数据库是计算机系统中用于存储和管理数据的一种软件系统。它通常由一个或多个数据集合、管理系统和应用程序组成,被广泛应用于企业、政府和个人等各种领域。目前常用的数据库系统包括关系型数据库和非关系型

    2024年02月07日
    浏览(39)
  • stata学习笔记(一)stata入门与基本操作

    这里开个新坑,主题有关stata使用以及定量分析入门,主要内容来自于之前与之后的课程学习、作业以及资料查询整理,主要目的是对个人学习过程的一个记录,方便日后回顾。 方法1:点击文件选项,选择导入,根据数据类型选择即可; 方法2::点击进入数据编辑器界面,点

    2024年02月21日
    浏览(29)
  • 链表入门:“单链表“的基本操作详解(C语言)

    目录 一,了解链表 二,基本操作的实现 1.  在代码开头的预处理和声明 2.  对链表进行初始化 一个错误案例的分析: 3.  对链表进行“增”操作 (1) “头插法”在链表头结点之后插入结点 (2) “尾插法”在链表的最后一个结点后插入结点 (3) 在指定位置插入结点 3,

    2024年02月04日
    浏览(27)
  • 电脑入门:路由器 基本设置操作说明

    路由器  基本设置操作说明 首先我们我设置路由器,就需要先登录路由器, 那么怎样登路由器啊? 登录路由器的方法是   在ie的地址栏输入:http://192.168.1.1  输入完成以后直接回车  那么如果你输入正确 这个时候就应该听到有用户名的提示  呵呵 这是怎么回事啊?  不要召

    2024年02月11日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包