Node.js 原理教程:入门应用程序

最后更新: 11/19/2025
作者: C 源跟踪
  • Node.js 的功能是面向事件和 E/S 的东方模型,没有理想的并发性。
  • 模块化架构:服务器、路由器和处理程序,方便升级和管理。
  • 通过常规、远景和中间件快速创建网络应用程序。
  • Trabaja con npm y modulos nativos para cubrir archivos, red, rutas y sistema.

教程 Node.js 原理

您可以先接触 Node.js,aquí tienes una guía pensada para empezar con buen pie: iremos de lo más básico a un Flujo de trabajo real, con ejemplos practicos y explicaciones claras.我们将与 Express 的 Web 应用程序一起为 Hola Mundo 提供支持,通过系统模块、npm 和 Node 来实现特殊的生态系统。

Además de orientarte con 必备条件、Visual Studio Code 的配置和入门项目可以组织 HTTP 服务器、输入请求、控制操作、处理 POST 数据以及事件驱动的文件。 Todo con un lenguaje cercano, sin rodeos, y con el toque necesario para que no te pierdas.

Node.js 的必备条件

JavaScript 基础知识的必要性 (提示、变量、函数、对象)y ganas de probar cosas con la consola。 Node.js 是 JavaScript 引擎的执行引擎,以 V8 为基础,具有强大的库和执行模型 事件发生时的迪里吉多 (dirigido) 和非爆炸事件 (bloqueante)。允许在创建希洛或请求时同时进行许多操作。

Con Node puedes construir servidores web、API REST、herramientas de línea de comandos、应用程序和实时应用(聊天、通知)、数据和物联网项目的集成。 Su fortaleza está en el manejo de E/S并发,lo que lo hace理想的交通和互动体验。

下载并安装

从官方网站下载 Node.js 在nodejs.org 上安装操作系统。在 Windows、macOS 或 Linux 上都有安装和安装包。安装后,确认终端连接: node -v y npm -v。 npm 是 Node 的管理器,并允许安装三个格式的库。

入门接触:Hola Mundo con VS Code

Si usas Visual Studio Code,将项目和兰扎尔终端集成到总商品中。创建 una 地毯 de trabajo 和 entra en ella: mkdir HelloNode && cd HelloNode.

与 VS Code 进行交互 代码。. 创建一个名为 app.js 我们介绍一下 algo sencillo para arrancar: un mensaje por consola.

var msg = 'Hello World';
console.log(msg);

打开 VS Code 中的终端集成(版本 > 终端,或按 Ctrl+`),然后执行 lanza node app.js. Verás el clásico 输出“Hello World” 恩拉康索拉;是的,首先,请确认一切都很好。

De cero a server: 最小的 HTTP 服务器

节点 trae un módulo nativo llamado 'http' 通过 Pocas Lineas 创建一个服务器。科拉松埃斯 http.createServer, que recibe una function 回调que se ejecuta 请求的卡达.

var http = require('http');

http.createServer(function (request, response) {
  response.writeHead(200, {'Content-Type': 'text/html'});
  response.write('Hola Mundo');
  response.end();
}).listen(8888);

Arráncalo con node server.js 你访问 http://localhost:8888/. La Magia de Node está en su modelo orientado a eventos: pasas una función y el runtime la “llama de vuelta”(回调)cuando sucede el evento(una petición entrante)。

回调、执行和执行的顺序

JavaScript 中的函数:se pueden pasar como argumentos、devolver y almacenar en 变量。您可以使用 Node 的事件管理器:您可以通过注册功能来执行成功(例如,通过 HTTP 进行指定)。

理解以下两者之间的区别至关重要 吹气与不吹气的操作。 Si 介绍了 CPU 持续运行的算法(例如,un bucle de espera)、进入控制程序并执行所有操作。恩节点, 与 E/S asíncrona 合作的工作人员 y 回调 o promesas para evitar bloquear el hilo。

模块化管理:服务器、路由器和管理器

分离责任 一个升级的项目:一个 HTTP 服务器模块、一个 enrutador 和一个控制者(请求处理程序)的其他模块。指数函数 exports 需要使用语言环境模块 require('./miModulo').

Una estructura típica podría ser: index.js como punto de entrada, 服务器.js con el HTTP 服务器, 路由器.js para decidir a qué función mandar cada ruta y requestHandlers.js con la lógica de cada 端点。该组织结构清晰易读。

额外的规则和规则

请求对象与 URL 请求. El módulo nativo url permite extraer el 路径名 y,si hace falta,la 查询。这样,路由器就可以执行控制操作。

var url = require('url');

function onRequest(request, response) {
  var pathname = url.parse(request.url).pathname;
  // route(pathname) ...
}

El router recibe el mapa de rutas a funciones (un objeto donde cada clave es una ruta, y el valor, el handler),junto con el 路径名,y comprueba si hay una función asociada。 Si 存在,la ejecuta; si no,devuelve un 404。

Haciendo que el handler responda (el patrón Correcto)

习惯性的诱惑 es hacer que el controlador retorne un string y que el servidor lo escriba。 Pero esto Falla cuando el handler necesita hacer algo asíncrono (como leer de disco o ejecutar un comando)。有效解决方案 注射物体反应 Hasta el handler y que el propio handler escriba la respuesta cuando la tenga(例如,回调函数)。

// router.js
function route(handle, pathname, response) {
  if (typeof handle[pathname] === 'function') {
    handle[pathname](response);
  } else {
    response.writeHead(404, {'Content-Type': 'text/html'});
    response.write('404 No Encontrado');
    response.end();
  }
}

这种方法允许 响应者 justo cuando la E/S asíncrona concluye, 罪孽 bloquear el proceso ni forzar a devolver datos antes de tiempo.

Express:创建 una 应用程序网络 只需几分钟

Express 是 Node.js 的极简框架 这是管理规则、远景、中间件和使用 HTTP 的便利工具。与生成器一起创建第二个项目的结构,并按常规、远景和递归方式进行设计。

  1. 为您的项目创建一个文件夹: mkdir ExpressProjects && cd ExpressProjects.
  2. Genera una plantilla: npx express-generator HelloWorld --view=pug 创建应用程序与哈巴狗的汽车。
  3. 在 VS Code 中打开code . y revisa la estructura: 箱子 (arranque) 国家 (JS/CSS/图像) 路线 (controladores de rutas), 意见 (样板) app.js (配置), 的package.json (脚本和依赖项)。
  4. 安装依赖项npm install en la carpeta del proyecto.
  5. 启动应用程序。例如,删除: npx cross-env DEBUG=HelloWorld:* npm start.
  6. 打开 http://localhost:3000. Prueba a cambiar la vista 校长:在 views/index.pug, sustituye el título por h1 "Hello World!" 并充电。

表达必要性 管理 GET、POST、PUT 和 DELETE、usar 中间件、服务、渲染视图和构建应用程序的变量页面和菜单摩擦。

npm 和 Node 的模数

npm 是 Node 包管理器 您允许安装 terceros 库。例如,以下 Express: npm install express. Después podrás require('express') y utilizarlo en tu codigo。 Esta Flexibilidad es clav para crecer con tu proyecto。

此外,Node 包括 原生模块 para tareas comunes: fs (archivos), http/https (服务员) path (路线), os (系统数据) url (解析 URL) y muchos más。重要的普埃塔洛斯 require() 没有安装任何东西。

Probando un módulo nativo:系统信息

操作系统数据模块。 Abre la consola y entra en el REPL de Node con node 创建档案时可以快速使用功能。

  1. os.platform() 平台(win32、linux、darwin...)。 Confirmarás el SO activo 直接。
  2. 连接器 os.arch() obtendrás la arquitectura(x64、arm64…)。 Útil para binarios o builds.
  3. 使用 os.cpus() para ver los nucleos disponibles。 理想的平衡载荷 con clústeres o processos hijos。
  4. Sal del REPL con .exit o pulsando Ctrl+C dos veces. 快速且无残留物.

三日图书馆

El ecosistema npm es enorme。 Algunas utilidades受欢迎: 尖锐 (图像和压缩的tratamiento), PDFKit (generación de PDF), 验证器 (validación de cadenas), 图像最小 y 丑化JS (minificación), 精灵匠 (精灵) 温斯顿 (记录)y commander.js (CLI)。安装 npm install <paquete> 当你需要它们时。

运行 Node.js 归档文件

保护您的档案,由 app.js 提供, y ejecútalo con node app.js 恩拉航站楼。这就是您的计划和结果,请参阅我们的服务,并在您的导航中进行。

真实应用程序的 REPL:flujo completo

Probar en el REPL es Perfecto para funciones pequeñas,但是,您可以通过存档、组织模块和 npm 脚本来进行交流。 De esta forma podrás 自动化 tarares con npm run y 纪录片 los comandos de inicio en package.json.

Manejando 数据 POST sin bloquear

Cando un usuario envía un Formulario, elcuerpo de la petición puede llegar en varios trozos。 En el server(回调 de createServer) añade 听众 data y end Para ir acumulando el contenido y procesarlo al Final。 Indica también la codificación, por ejemplo UTF-8, para manipularlo Correctamente.

request.setEncoding('utf8');
var postBody = '';
request.addListener('data', function(chunk) {
  postBody += chunk;
});
request.addListener('end', function() {
  // route(handle, pathname, response, postBody)
});

如果需要在个人之外, 使用模块 'querystring' 帕拉·帕萨埃尔·奎尔波·宽多·莱加·科莫 application/x-www-form-urlencoded: querystring.parse(postBody).text,例如。

成本操作和执行不对外开放

系统执行委员 罪孽 el servidor, utiliza child_process.exec y 响应回调。常见问题解答 timeout o maxBuffer 辅助控制突击队员。 El patrón es siempre elmismo: nada de bloquear,您的回复者 cuando haya datos。

var exec = require('child_process').exec;

function handler(response) {
  exec('ls -lah', function(error, stdout, stderr) {
    response.writeHead(200, {'Content-Type': 'text/plain'});
    response.write(stdout);
    response.end();
  });
}

如果您的命令非常紧急,请按照正常情况恢复响应 希洛校长没有 hagas trabajo sincrónico costoso.

Subidas de ficheros: enfoque y herramientas

Para manejar 上传多部分 (其他档案中的图片)更多的实践是重复的一个特殊的包。模数 强大 facilitan parsear formularios multipart/form-data,访问临时档案并移动至目的地。 La idea es la Misma: 回调/承诺 y trabajar de forma segura con Streams。

完成之前的步骤,重要的是在流感中上传: 服务器 que recibe el formulario, 路由器 que dirige a la ruta de subida, y 处理器 que valida, Guarda y responde con el resultado (por ejemplo,mostrando la imagen)。

远景与动态的结构

Si optas por Express 与 Pug u otro 电机, el controlador pasa datos a la vista y esta los renderiza. Para un Formulario sencillo con un textarea enviado por POST y una ruta que lo muestra, basta con dos handlers: uno que Sirve el Formulario y otro que 进程与进展 收到。

良好的组织实践

Evita archivos monolíticos。除以模数,nombra funciones con verbos que expresen acciones(例如, 启动, 上载, 名单), y desacopla con inyección de dependentencias cuando tenga sentido (pasando funciones o mapas de rutas al servidor y al router)。曼特内尔 las capas ligeras te 允许 crecer sin dolores。

如何构建 Node.js

Su模型事件驱动和非阻塞 特别值得一提的是:Web 服务、REST API、实时应用程序(聊天、仪表板)、机器人和 CLI、数据基础集成、工作负载和硬件控制。借助网络套接字和流媒体,您可以自然地体验互动体验。

  • Servidores y sitios web con plantillas o SSR。
  • REST API 为中音做好准备。
  • 实时性 聊天、通知或游戏的连接套接字。
  • 命令行工具 使任务自动化。
  • 数据处理和数据基础,colas 和管道。
  • 物联网和硬件 con librerías específicas.

学习与实践的方法

存在交互性的问题 拉多拉多,理想的速度很快。接下来,您将获得以下提示:在本地终端上记录、执行和执行,这就是原则上的全部内容。

Visual Studio Code: 编辑器的生产力

综合终端、depurador 和 las 扩展 VS Code 与 Node 的工作环境非常相似。 Desde “Ver > Terminal” puedes abrir shells, cambiar el preminated y ejecutar node o npm run 罪孽放弃埃尔编辑。阿德马斯, 配置 launch.json 请允许我们继续前进。

版本和建立的注意事项

经典的经典作品有很多关于安提瓜斯德诺德版本的问题,但 色彩概念:回调、本地模块、asincronía、enrutado y separación de responsabilidades。与实际版本相比,我们的工作更加快速和安全,并且与更多的生态系统相结合。

下载和附加递归

提供有关文档、PDF 和教程的扩展研究。最新和下载节点官方网站修订,包含教学内容 练习、测验和挑战 para afianzar conocimientos a medida que avances.

本书提供了丰富的材料补充、介绍和实践参考,以及所需的海洋资源。 Mantén tu foco en practicar: leer está bien; ejecutar、romper cosas y arreglarlas、mejor。

Ejemplo completo:带有路由器和处理程序的迷你应用程序

Juntando piezas. Imagina un proyecto con index.js que arranca el servidor, 服务器.js con HTTP y parsing de POST, 路由器.js 决定执行功能 requestHandlers.js 惯例: una que muestra un Formulario y otra que enseña el texto enviado。

// index.js
var server = require('./server');
var router = require('./router');
var handlers = require('./requestHandlers');

var handle = {};
handle['/'] = handlers.iniciar;
handle['/iniciar'] = handlers.iniciar;
handle['/subir'] = handlers.subir;

server.iniciar(router.route, handle);
// server.js
var http = require('http');
var url = require('url');

function iniciar(route, handle) {
  function onRequest(request, response) {
    var postData = '';
    var pathname = url.parse(request.url).pathname;

    request.setEncoding('utf8');
    request.addListener('data', function(chunk) { postData += chunk; });
    request.addListener('end', function() {
      route(handle, pathname, response, postData);
    });
  }

  http.createServer(onRequest).listen(8888);
}

exports.iniciar = iniciar;
// router.js
function route(handle, pathname, response, postData) {
  if (typeof handle[pathname] === 'function') {
    handle[pathname](response, postData);
  } else {
    response.writeHead(404, {'Content-Type': 'text/html'});
    response.end('404 No Encontrado');
  }
}

exports.route = route;
// requestHandlers.js
var querystring = require('querystring');

function iniciar(response) {
  var body = '<html>'+
    '<head><meta charset=\'UTF-8\' /></head>'+
    '<body>'+
    '<form action=\'/subir\' method=\'post\'>'+
    '<textarea name=\'text\' rows=\'10\' cols=\'40\'></textarea>'+
    '<input type=\'submit\' value=\'Enviar\' />'+
    '</form>'+
    '</body></html>';

  response.writeHead(200, {'Content-Type': 'text/html'});
  response.end(body);
}

function subir(response, postData) {
  var text = querystring.parse(postData).text || '';
  response.writeHead(200, {'Content-Type': 'text/html'});
  response.end('Tu enviaste: ' + text);
}

exports.iniciar = iniciar;
exports.subir = subir;

Con este esqueleto minimo ya tienes Unservidor functional y no bloqueante,与单独控制者一起,为实现远景做好准备,上传或与数据基地集成。

La clave de Node está en pensar en “acciones”: 市场功能、依赖关系和责任。 Así,您的应用程序可以帮助您轻松管理并适应复杂的情况。

Todo lo visto te da una base sólida: desde instalar Node y ejecutar tu prime script, pasando por VS Code, 联合国 HTTP nativo 服务器、enrutado propio、Express、npm、módulos nativos、REPL、asincronía sin bloqueos y manejo de Formularios POST。在实践和迭代中,我们将构建一个完整的项目,以明确说明。

相关文章: