在 Youtube 上观看完整的 Nodejs 和 ExpressJsTutorial

https://youtu.be/hKyudh3rC_A

Nodejs介绍

所以 node.js 首先不是一种语言,它不是一个框架,它是一个免费和开源的 JavaScript 运行时。现在什么是运行时以及它与 javascript 引擎的不同之处,所以 javascript 引擎只是执行代码,但运行时环境就像 node.js 一样在 node.js 中有一些额外的服务器端模块。 node.js 能够在服务器上运行 javascript 代码,这是一个突破,因为现在这是 node.js 第一次可以运行 javascript,或者任何东西都可以在服务器上运行 javascript。

Node.js 使用异步编程!

但是问)什么是异步?

think.webp

这里是异步和同步的区别

下载.png

下载(1).png

Q)为什么选择 Node.js?

-> Web 服务器的一个常见任务是在服务器上打开文件并将内容返回给客户端。

这是 Node.js 处理文件请求的方式:

1\。将任务发送到计算机的文件系统。

2\。准备好处理下一个请求。

3\。当文件系统打开并读取文件后,服务器将内容返回给客户端。

Node.js 消除了等待,只需继续下一个请求。

Node.js 运行单线程、非阻塞、异步编程,非常节省内存。

Node.js 能做什么?

  • Node.js可以生成动态页面内容

  • Node.js可以在服务器上创建、打开、读取、写入、删除和关闭文件

  • Node.js可以收集表单数据

  • Node.js 可以添加、删除、修改数据库中的数据

截图 (53).png

如何安装 Nodejs

Node.js官网有Nodejs的安装说明:

或者你可以在这里观看

创建您的第一个服务器

const http = require('node:http');

// Create a local server to receive data from
const server = http.createServer((req, res) => {
  res.writeHead(200, { 'Content-Type': 'application/json' });
  res.end(JSON.stringify({
    data: 'Hello World!'
  }));
});

server.listen(3000);

输出截图 (56).png

Node.js 模块

Q)Node.js 中的模块是什么?

\u003d> 将模块视为与 JavaScript 库相同。

  • 您想在应用程序中包含的一组功能。

内置模块

Node.js 有一组内置模块,无需进一步安装即可使用。

查看内置模块参考以获得完整的模块列表。

包含模块

要包含模块,请使用带有模块名称的 require() 函数:

let http = require('http');
// Now your application has access to the HTTP module, and is able to create a server:
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/html'});
  res.end('Hello World!');
}).listen(3000);
创建您自己的模块

看这里

您可以创建自己的模块,并轻松地将它们包含在您的应用程序中。

以下示例创建一个返回日期和时间对象的模块:

Create a module that returns the current date and time:

exports.myDateTime = function () {
  return Date();
};

使用 exports 关键字使属性和方法在模块文件之外可用。

将上面的代码保存在一个名为“myfirstmodule.js”的文件中

包括您自己的模块

现在,您可以在任何 Node.js 文件中包含和使用该模块。

// Use the module "myfirstmodule" in a Node.js file:

let http = require('http');
let dt = require('./myfirstmodule');

http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/html'});
  res.write("The date and time are currently: " + dt.myDateTime());
  res.end();
}).listen(3000);

// Notice that we use ./ to locate the module, that means that 
// the module is located in the same folder as the Node.js file.

全局对象

看这里

这些对象在所有模块中都可用。以下变量可能看起来是全局的,但不是。它们仅存在于模块范围内:

  • __目录名

  • __文件名

  • 出口

  • 模块

  • 要求()

此处列出的对象特定于 Node.js。有一些内置对象是 JavaScript 语言本身的一部分,它们也是全局可访问的。

Node.js package.json 字段定义

看这里

本节介绍 Node.js 运行时使用的字段。其他工具(例如 npm)使用 Node.js 忽略的附加字段。

node.js 中使用了 package.json 文件中的以下字段:

1.“名称”

2.“主要”

3.“包管理器”

4.“类型”

5.“出口”

6.“进口”

nodemon

nodemon 是一个工具,它通过在检测到目录中的文件更改时自动重新启动节点应用程序来帮助开发基于 Node.js 的应用程序。

安装

看这里

npm i nodemon

文件系统模块

看这里

fs.readFile(路径[, options], 回调)

异步读取文件的全部内容。

import { readFile } from 'node:fs';

readFile('/etc/passwd', (err, data) => {
  if (err) throw err;
  console.log(data);
});

回调传递了两个参数 (err, data),其中 data 是文件的内容。如果未指定编码,则返回原始缓冲区。如果选项是字符串,则它指定编码:

import { readFile } from 'node:fs';

readFile('/etc/passwd', 'utf8', callback);

Nodejs 事件循环

看这里

我们终于到达了臭名昭著的事件循环。这是一个不断运行的进程,用于检查调用堆栈是否为空。把它想象成一个时钟,每次它滴答作响时,它都会查看调用堆栈,如果它是空的,它会查看事件队列。如果事件队列中有东西在等待它被移动到调用堆栈。如果没有,那么什么也不会发生。

ek7ji4zrimozpp2yzk0a.webp

gif3.1.gif

gif4.gif

图片来源:-Lydia Hallie

ExpressJS

Express 是一个node js web 应用程序框架,为构建web 和移动应用程序提供了广泛的功能。它用于构建单页、多页和混合Web 应用程序。它是建立在 Node js 之上的一层,有助于管理服务器和路由

安装

看这里

$ npm install express --save
const express = require('express')
const app = express()
const port = 3000

app.get('/', (req, res) => {
  res.send('Hello World!')
})

app.listen(port, () => {
  console.log(`Example app listening on port ${port}`)
})
//This app starts a server and listens on port 3000 
//for connections.The app responds with “Hello World!” 
//for requests to the root URL (/) or route.

ExpressJs 中的基本路由

看这里

//Respond with Hello World! on the homepage:
app.get('/', (req, res) => {
  res.send('Hello World!')
});

//Respond to POST request on the home page:
app.post('/', (req, res) => {
  res.send('Got a POST request')
});

//Respond to a PUT request to the /user route:
app.put('/user', (req, res) => {
  res.send('Got a PUT request at /user')
});

//Respond to a DELETE request to the /user route:
app.delete('/user', (req, res) => {
  res.send('Got a DELETE request at /user')
});

连接MongoDB

在这里观看

Q)什么是控制器?

\u003d> 控制器只是要处理请求并做需要的事情,路由文件不负责所有这些应该在控制器中完成的事情。

看这里

const { ObjectId } = require("mongodb");
const Book = require("../models/Book");

exports.index = async (req, res) => {
  const books = await Book.find();
  res.json(books);
};

exports.store = async (req, res) => {
  try {
    await Book.create(req.body);
    res.status(201).json({ data: "Book is stored" });
  } catch (error) {
    res.json(error.errors);
  }
};

exports.show = async (req, res) => {
  const _id = ObjectId(req.params.id);
  const book = await Book.find({ _id });
  res.json(book);
};

exports.udpate = async (req, res) => {
  const _id = ObjectId(req.params.id);
  await Book.updateOne({ _id }, { $set: req.body });
  res.json({ data: "Book is updated" });
};

exports.delete = async (req, res) => {
  const _id = ObjectId(req.params.id);
  await Book.deleteOne({ _id });
  res.status(204).json();
};

每次我们需要与数据库连接时,我们可以看到我们正在做的一切,每次我们需要找到我们需要处理的集合时,这不是一件坏事,但我们可以改进它以直接建立连接对于 MongoDB,我们将使用另一个名为 mongoose 的包

安装猫鼬

看这里

npm i mongoose

使用猫鼬连接数据库,而不是正常的 MongoDB 连接,一旦完成,您需要定义一些 model 现在 Q)什么是模型 实际上是一个文件或一个类,你可以说哪个直接连接到单个集合,因此如果我创建博客文章模型,该模型将负责博客文章集合或考虑博客文章表,我们需要定义每个字段,这就是我们在这里所做的。

const { mongoose } = require("mongoose");

const BookSchema = mongoose.Schema({
  title: {
    type: String,
    required: true,
  },
  author: {
    type: String,
    required: true,
  },
});

module.exports = mongoose.model("Book", BookSchema, "book");

如何在 Node 和 Expressjs 中进行 SignUp 和 LoginUp 认证

看这里更好地理解

const User = require("../models/User");
const bcrypt = require("bcrypt");
var jwt = require("jsonwebtoken");
const saltRounds = 10;

exports.signup = async (req, res) => {
  const password = await bcrypt.hash(req.body.password, saltRounds);
  const data = { ...req.body, password };
  const user = await User.create(data);
  res.json({ user });
};

exports.login = async (req, res) => {
  const user = await User.findOne({ email: req.body.email });
  if (!user) {
    res.status(404).json({ error: "User not found" });
    return;
  }

  if (!(await bcrypt.compare(req.body.password, user.password))) {
    res.status(404).json({ error: "User not found" });
    return;
  }

  const token = await jwt.sign({ user }, "fake-jwt-secret");
  res.json({ user, access_token: token });
};

JWT 访问令牌

JSON Web Token 是一个提议的 Internet 标准,用于创建具有可选签名和/或可选加密的数据,其有效负载包含声明一定数量声明的 JSON。令牌使用私有密钥或公钥/私钥签名。

安装

看这里

npm i jsonwebtoken

中间件

看这里

中间件就像一个守卫,它将保护代码继续执行或不执行,所以它会说好的,然后再去,但如果有问题,就停在这里

中间件函数可以执行以下任务:

  • 执行任意代码。

  • 更改请求和响应对象。

  • 结束请求-响应循环。

  • 调用栈中的下一个中间件

截图 (58).png

JWT 授权

看这里

任何授权的正常流程就像首先我们调用用户我们得到这样的用户令牌,我们复制该令牌然后在此之后,如果我们发送查询权限,我们可以转到任何受保护的路线,它说未经授权的 401 但我们需要像承载一样发送身份验证令牌或授权令牌,如果我发送它应该给我们真实的内容,因为现在我们有有效的令牌,但是我们如何首先检查令牌。

这就是你需要知道的关于 Nodejs 和 Expressjs 的全部内容

finally.webp

到目前为止,我们学到了很多东西。请务必提出问题以进行澄清并提出更正和建议,我期待他们。以上就是我的全部内容了,欢迎在评论区分享你的看法,感谢阅读。查看我的另一篇文章这里。另外,订阅我的时事通讯。在社交上关注我。快乐学习和编码

200w (1).webp

订阅我的 YouTube 频道

在 Twitter 上关注我

非常感谢您的参与

Logo

MongoDB社区为您提供最前沿的新闻资讯和知识内容

更多推荐