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}`)
});
node app.js
在终端中执行。您将在终端中看到以下内容:
Nodejs server started on port 8081
基本上你的服务器已经在 8081 端口启动了!
让我们测试一下curl
:
curl -X GET http://localhost:8081
或者在浏览器中访问http://localhost:8081
,查看上述服务器发送的响应。
就这样!你刚刚构建了你的第一个 Node 应用。
那么,上面的代码是怎么回事?http
这是一个内置的 Node 模块,你可以使用require()
它来导入它。http
模块公开了一个函数createServer()
,可以用来创建 HTTP 服务器。
你必须将一个回调函数作为参数传递给 createServer() 函数。每次服务器收到请求时,都会执行此函数。回调函数的参数是 HTTPrequest
和response
对象。
我们使用了这些response
对象方法 -
- writeHead() - 第一个参数是响应状态代码,第二个参数是任何响应标头。
- write() - 添加要发送回客户端的响应主体。
- end() - 告诉服务器响应已完成。当然,我们可以在调用
response.write()
之前添加任意数量的调用来发送更多数据。response.end()
在这里,我们只是发送一个带有“TODO”文本的 h1 标签。curl
命令打印出这样的响应:
<h1>TODO<h1>
浏览器呈现 HTML 标签并显示带有文本 TODO 的 h1 标题。
- 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();
现在服务器检查 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);
});
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'
现在,如果您已经阅读了整篇文章,那么您对 Node.js 已经有了很好的了解,当然,还有很多新的东西需要探索。
表达
Express.js 是一个 Node.js 框架,它简化了 API 的构建。
我们将实现之前使用 Node.js 创建的 API。您可以比较两种实现,看看 Express.js 如何简化 API 的构建。
首先,让我们在您的系统上运行 Express。
$ npm install express
与仅使用 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
:/todos
Express
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}`)
});
- 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();
});
如果您不调用 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}`)
});
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