MERN 的“N”和“E”——Node.js 和 Express.js Express 的基础知识

2025-06-07

MERN 的“N”和“E”——Node.js 和 Express.js 的基础知识

表达

介绍

什么是 Node.js?

Node.js is an open-source, cross-platform, back-end, JavaScript runtime environment that executes JavaScript code outside a web browser.

开源——因为它的源代码可以合法使用和修改。
跨平台——可以在 Linux、OSX 和 Windows 等不同平台上运行。
后端——接收来自客户端的请求并包含响应逻辑。JS
运行时环境——JavaScript 代码的解析和执行环境。

Node 是一个 JavaScript 环境,基于 Google Chrome 浏览器所使用的 JavaScript 引擎构建。它拥有一些出色的功能,使其成为构建服务器端应用程序(包括 Web 服务器和平台 API 的 Web 服务)的理想之选。

本文的主要目标 -

  • 了解如何构建 Node.js 应用程序
  • 使用 Node.js 实现 TODO 应用程序
  • 使用 Express.js 实现 REST API

先决条件- 由于 Node.js 基于 JavaScript,因此对于了解 JavaScript 的开发者来说,学习入门会更容易。这也意味着现在只需具备 JavaScript 知识即可编写前端和后端。

在开始之前,请确保你已经安装了 Node。从这里
安装

让我们开始吧——
让我们看看如何使用 Node.js 创建一个简单的服务器

创建文件 app.js 并粘贴以下代码-

// File: app.js

const http = require('http');
const port = 8081;

http.createServer((request, response) => {

    // Set response status code and response headers
    response.writeHead(200, { 'Content-Type': 'text/html' });

    // Set response body i.e, data to be sent
    response.write('<h1>TODO</h1>');

    // Tell the server the response is complete and to close the connection
    response.end();

}).listen(port, () => {

    // Log text to the terminal once the server starts
    console.log(`Nodejs server started on port ${port}`)

});
Enter fullscreen mode Exit fullscreen mode

node app.js在终端中执行。您将在终端中看到以下内容:

Nodejs server started on port 8081
Enter fullscreen mode Exit fullscreen mode

基本上你的服务器已经在 8081 端口启动了!
让我们测试一下curl

curl -X GET http://localhost:8081

或者在浏览器中访问http://localhost:8081,查看上述服务器发送的响应。
就这样!你刚刚构建了你的第一个 Node 应用。

那么,上面的代码是怎么回事?
http这是一个内置的 Node 模块,你可以使用require()它来导入它。http
模块公开了一个函数createServer(),可以用来创建 HTTP 服务器。
你必须将一个回调函数作为参数传递给 createServer() 函数。每次服务器收到请求时,都会执行此函数。回调函数的参数是 HTTPrequestresponse对象。
我们使用了这些response对象方法 -

  • writeHead() - 第一个参数是响应状态代码,第二个参数是任何响应标头。
  • write() - 添加要发送回客户端的响应主体。
  • end() - 告诉服务器响应已完成。当然,我们可以在调用response.write()之前添加任意数量的调用来发送更多数据。response.end()

在这里,我们只是发送一个带有“TODO”文本的 h1 标签。curl
命令打印出这样的响应:

<h1>TODO<h1>
Enter fullscreen mode Exit fullscreen mode

浏览器呈现 HTML 标签并显示带有文本 TODO 的 h1 标题。
TODO 浏览器渲染

  • listen() 方法设置服务器监听请求的端口。您还可以为 listen() 添加一个回调函数,该函数将在服务器启动时执行一次。通常,我们会添加类似下面的代码Nodejs server started on port 8081来确保服务器正在监听。

路由

好的。目前,我们的服务器会向收到的每个请求(无论 URL 和方法)发送相同的响应(h1 标签),状态码为 200。
让我们将 createServer() 方法的主体修改为:

const { method, url } = request;
//fetch request method and path by using the request object’s method and url properties.

if (url == "/todos") {

    if (method == "GET") {
        response.writeHead(200, { 'Content-Type': 'text/html' });
        response.write('<h1>TODO</h1>');
        response.write('<p>Track your work</p>');
    } else {
        response.writeHead(501); //or response.statusCode = 501
    }

} else {
    response.writeHead(404);
}

response.end();
Enter fullscreen mode Exit fullscreen mode

现在服务器检查 url 变量是否为 /todos ?
如果是,则检查方法是否为 GET ?
如果是,则返回标头和 HTML 响应
;否则,仅返回 501 状态代码;
否则,返回 404 状态代码。

现在如果你尝试

curl -X GET http://localhost:8081/random

你能猜出服务器会返回什么响应吗?
URL 路径是 /random,所以服务器会返回 404 状态码。
如果你尝试

curl -X POST http://localhost:8081/todos

是的,url 是 /todos,但方法是 POST,现在您将获得响应代码 501。

请注意,如果未明确设置,则默认发送 -200 OK 响应状态代码。

请求正文

request传递给处理程序的对象实现了该接口ReadableStream。此流可以像任何其他流一样被监听或通过管道传输到其他地方。我们可以通过监听流的“data”和“end”事件直接从流中获取数据。
request.on()方法可用于查找流事件。数据以块的形式读取,并存储在一个缓冲区中。
读取完整数据后(通过 end 事件可知),您可以使用 JSON.parse() 函数将 JSON 数据解析为 JavaScript 对象。

let body = '';

    request.on('error', (err) => {
        console.error(err);

    }).on('data', (chunk) => {

        body += chunk;  //keep concatenating the chunk 

    }).on('end', () => {
        body = JSON.parse(body);
    });
Enter fullscreen mode Exit fullscreen mode

URL 模块

如果我们想根据 URL 参数过滤响应怎么办?
我们可以使用内置URL模块 -
URL 模块将网址拆分为可读的部分。


var url = require('url');
var adr = 'http://localhost:8081/default.htm?year=2017&month=february';  //request.url
var q = url.parse(adr, true);

console.log(q.host); //returns 'localhost:8081'
console.log(q.pathname); //returns '/default.htm'
console.log(q.search); //returns '?year=2017&month=february'

var qdata = q.query; //returns an object: { year: 2017, month: 'february' }
console.log(qdata.month); //returns 'february'
Enter fullscreen mode Exit fullscreen mode

现在,如果您已经阅读了整篇文章,那么您对 ​​Node.js 已经有了很好的了解,当然,还有很多新的东西需要探索。

表达

Express.js 是一个 Node.js 框架,它简化了 API 的构建。
我们将实现之前使用 Node.js 创建的 API。您可以比较两种实现,看看 Express.js 如何简化 API 的构建。
首先,让我们在您的系统上运行 Express。

$ npm install express
Enter fullscreen mode Exit fullscreen mode

与仅使用 Node 库开发 Web 服务器相比,Express 使您能够创建更易读、更灵活、更易于维护的 Web 服务器HTTP,而仅使用 Node 库开发 Web 服务器也会变得很复杂。

Express 和 HTTP 方法中的路由

定义路由处理函数的语法是:

app.httpMethod(path, handler) {...}

这里的 httpMethod 可以是 get、put、post、delete 等等。path 是请求实际到达的路由,handler 是我们在 node.js 中传递给 createServer() 的同一个回调函数,也就是在找到请求的路由时执行的回调函数。
让我们使用以下代码实现路径GET API/todosExpress

const app = express();

app.get("/todos", (request,response) => {
    response.status(200);
    response.send('<h1>TODO</h1>');

});
const port = 8081;

app.listen(port, function(){

    console.log(`Nodejs server started on port ${port}`)

});
Enter fullscreen mode Exit fullscreen mode
  • Express Server 使用 express() 方法初始化。
  • 对于 GET,我们使用 app.get() 方法,同样,对于其他 HTTP 方法,您将使用 app.post()、app.delete() 等。
  • 响应对象的 send() 方法用于发送响应主体。
  • 要将服务器绑定到端口,请使用 Express 应用程序 app 上的 listen() 方法。

由于 Javascript 是一种区分大小写的语言,因此 app.GET() 将不起作用。

Express 中间件

中间件函数可以访问请求和响应对象,就像我们在路由中访问一样。中间件能够修改请求和响应对象,还可以结束响应循环。你可以将中间件视为一堆函数,每当向服务器发出请求时,这些函数就会执行。
通常,中间件函数接受 3 个参数:请求对象、响应对象和“next”函数。每当编写中间件时,都必须在每个中间件函数的末尾调用此 next() 函数。为了在应用程序中使用中间件,你必须调用 app.use() 并将中间件函数作为参数传递。
例如:

// User defined Middleware
app.use(function(req, res, next){
   console.log('Inside Middleware function...');
   next();
});
Enter fullscreen mode Exit fullscreen mode

如果您不调用 next(),则不会再处理任何路由处理程序或中间件。如果出于某种原因,您仍然不想调用 next(),那么只需向客户端发送响应即可,否则客户端将保持挂起状态并最终超时。

现在我们对 Express 有了基本的了解,让我们使用 Express 完成我们的 TODO 应用程序。

const express = require('express'); 
//importing express

const app = express();
//initializing express app

app.use(express.json())
//express.json() middleware to parse the request body as JSON.

const port = 8081

let todoList = ["Complete writing blog", "Complete project"];

/* Get all TODOS:   
** curl -v http://localhost:8081/todos
*/
app.get("/todos", (request, response) => {
    response.send(todoList);
});

/* Add a TODO to the list
** curl -v -X POST -d '{"name":"Plan for next week"}' http://localhost:8081/todos -H 'content-type:application/json'
*/
app.post("/todos", (request, response) => {
    let newTodo = request.body.name;
    todoList.push(newTodo);
    response.status(201).send();
});

/* Delete a TODO to the list
** curl -v -X DELETE -d '{"name":"Complete writing blog"}' http://localhost:8081/todos
*/
app.delete("/todos", (request, response) => {
    let deleteTodo = request.body.name;
    console.log(deleteTodo);
    for (let i = 0; i < todoList.length; i++) {
        if (todoList[i] === deleteTodo) {
            todoList.splice(i, 1);
            response.status(204).send();
        }
    }
});

app.all("/todos", (request, response) => {
    response.status(501).send()
})

app.all("*", (request, response) => {
    response.status(404).send()
})

app.listen(port, () => {
    console.log(`Nodejs server started on port ${port}`)
});
Enter fullscreen mode Exit fullscreen mode

app.all() 是什么?要为除 GET、POST 和 DELETE 之外的
请求发送 501 状态码,我们可以在当前路由集下方使用 app.all() 方法。对于任何未实现的路由,Express 默认返回带有 HTML 内容的 404 状态码,或者我们也可以在末尾使用 app.all() 方法添加自定义 404 处理程序。/todos

结论

恭喜你完成了!本文我们学到了很多,希望你现在已经对 Node 和 Express 有了一定的了解。现在,你可以使用 Node.js 框架创建简单的应用程序,使用 Node.js 创建一个监听多个路由的 Web 服务器,并在 Node 应用程序中使用 Express.js 库。我很快会发布更多关于这个主题的文章。

到那时:继续学习:)

另外,如果您喜欢这篇文章,请❤️。

文章来源:https://dev.to/jaskaran/n-and-e-of-mern-fundamentals-of-node-js-and-express-js-13bc
PREV
Zsh 与 Bash zsh 和 bash 之间的简要区别
NEXT
你会做出反应吗?——构建一个视频应用程序