Maison interface Web js tutoriel Comment créer un serveur Web avec Node.js

Comment créer un serveur Web avec Node.js

Jan 05, 2021 pm 05:45 PM
node.js web服务器

使用nodejs搭建Web服务器是学习Node.js比较全面的入门教程,因为实现Web服务器需要用到几个比较重要的模块:http模块、文件系统、url解析模块、路径解析模块、以及301重定向技术等,下面我们就一起来学习如何搭建一个简单的Web服务器。

Comment créer un serveur Web avec Node.js

相关推荐:《nodejs 教程

作为一个Web服务器应具备以下几个功能:

  • 能显示以 .html/.htm 结尾的 Web 页面
  • 能直接打开以 .js/.css/.json/.text 结尾的文件内容
  • 显示图片资源
  • 自动下载以 .apk/.docx/.zip 结尾的文件
  • 形如 http://xxx.com/a/b/ ,  则查找b目录下是否有index.html, 如果有就显示,如果没有就列出该目录下的所有文件及文件夹,并可以进一步访问。
  • 形如 http://xxx.com/a/b,  则作301重定向到 http://xxx.com/a/b/ , 这样可以解决内部资源引用错位的问题。

引入需要用到的几个模块:

// http协议模块
var http = require('http');
// url解析模块
var url = require('url');
// 文件系统模块
var fs = require('fs');
// 路径解析模块
var path = require('path');
Copier après la connexion

创建服务并在指定的端口监听:

// 创建一个服务
var httpServer = http.createServer(this.processRequest.bind(this));

// 在指定的端口监听服务
httpServer.listen(port, function() {
    console.log('[HttpServer][Start]', 'runing at http://' + ip + ':' + port + '/');
    console.timeEnd('[HttpServer][Start]');
});
Copier après la connexion

在创建服务的时候需要传递一个匿名函数 processRequest 对请求进行处理,processRequest接收两个参数,分别是 request 和 response, request 对象中包含了请求的所有内容,response 是用来设置响应头以及对客户端做出响应操作。

processRequest: function (request, response) {
    varhasExt = true;
    varrequestUrl = request.url;
    varpathName = url.parse(requestUrl).pathname;
 
    // 对请求的路径进行解码,防止中文乱码
    pathName = decodeURI(pathName);
 
    // 如果路径中没有扩展名
    if(path.extname(pathName) === '') {
        // 如果不是以/结尾的,加/并作301重定向
        if(pathName.charAt(pathName.length-1) != '/'){
            pathName += '/';
            varredirect = 'http://'+ request.headers.host + pathName;
            response.writeHead(301, {
                location: redirect
            });
            response.end();
            return;
        }
        // 添加默认的访问页面,但这个页面不一定存在,后面会处理
        pathName += 'index.html';
        hasExt = false; // 标记默认页面是程序自动添加的
    }
 
    // 获取资源文件的相对路径
    varfilePath = path.join('http/webroot', pathName);
 
    // 获取对应文件的文档类型
    varcontentType = this.getContentType(filePath);
 
    // 如果文件名存在
    fs.exists(filePath, function(exists) {
        if(exists) {
            response.writeHead(200, {'content-type': contentType});
            varstream = fs.createReadStream(filePath, {flags: 'r', encoding: null});
            stream.on('error', function () {
                response.writeHead(500, {'content-type': 'text/html'});
                response.end(&#39;<h1>500 Server Error</h1>&#39;);
            });
            // 返回文件内容
            stream.pipe(response);
        } else{ // 文件名不存在的情况
            if(hasExt) {
                // 如果这个文件不是程序自动添加的,直接返回404
                response.writeHead(404, {&#39;content-type&#39;: &#39;text/html&#39;});
                response.end(&#39;<h1>404 Not Found</h1>&#39;);
            } else{
                // 如果文件是程序自动添加的且不存在,则表示用户希望访问的是该目录下的文件列表
                varhtml = "<head><meta charset=&#39;utf-8&#39;></head>";
                try{
                    // 用户访问目录
                    varfiledir = filePath.substring(0, filePath.lastIndexOf(&#39;\\&#39;));
                    // 获取用户访问路径下的文件列表
                    varfiles = fs.readdirSync(filedir);
                    // 将访问路径下的所以文件一一列举出来,并添加超链接,以便用户进一步访问
                    for(vari infiles) {
                        varfilename = files[i];
                        html += "<div><a  href=&#39;"+ filename + "&#39;>"+ filename + "</a></div>";
                    }
                } catch(e){
                    html += &#39;<h1>您访问的目录不存在</h1>&#39;;
                }
                response.writeHead(200, {&#39;content-type&#39;: &#39;text/html&#39;});
                response.end(html);
            }
        }
    });
}
Copier après la connexion

请求处理函数中有几个重点需要说一下:

对于路径中有中文的,浏览器会自动进行编码(英文不变,中文会变),因此在接收到地址后,需要对地址进行解码,否则最后得到的路径和真实路径不相符,

当访问路径不是以具体的文件结尾,并且不是以/结尾,则需要通过重定向加上/,表示当前目录,否则当前路径下的静态资源会找不到。

如果访问路径是目录,则列出该目录下所有文件及文件夹,并可以点击访问,为了让中文目录能正常显示,则还要在header中设置charset=utf-8

核心代码就这么多,大概140行左右,完整的代码已上传到 github : https://github.com/git-onepixel/Node,  

如果要运行demo,打开 cmd 切换到根目录,运行 node start 即可。

如有问题,欢迎讨论!

更多编程相关知识,请访问:编程教学!!

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Où trouver la courte de la grue à atomide atomique
1 Il y a quelques semaines By DDD

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Un article pour parler du contrôle de la mémoire dans Node Un article pour parler du contrôle de la mémoire dans Node Apr 26, 2023 pm 05:37 PM

Le service Node construit sur une base non bloquante et piloté par les événements présente l'avantage d'une faible consommation de mémoire et est très adapté à la gestion de requêtes réseau massives. Dans le contexte de demandes massives, les questions liées au « contrôle de la mémoire » doivent être prises en compte. 1. Le mécanisme de récupération de place du V8 et les limitations de mémoire Js sont contrôlés par la machine de récupération de place

Explication graphique détaillée de la mémoire et du GC du moteur Node V8 Explication graphique détaillée de la mémoire et du GC du moteur Node V8 Mar 29, 2023 pm 06:02 PM

Cet article vous donnera une compréhension approfondie de la mémoire et du garbage collector (GC) du moteur NodeJS V8. J'espère qu'il vous sera utile !

Audit de sécurité et gestion des journaux d'événements des serveurs Web construits sur CentOS Audit de sécurité et gestion des journaux d'événements des serveurs Web construits sur CentOS Aug 05, 2023 pm 02:33 PM

Présentation de l'audit de sécurité et de la gestion des journaux d'événements des serveurs Web construits sur CentOS Avec le développement d'Internet, l'audit de sécurité et la gestion des journaux d'événements des serveurs Web sont devenus de plus en plus importants. Après avoir configuré un serveur Web sur le système d'exploitation CentOS, nous devons prêter attention à la sécurité du serveur et protéger le serveur contre les attaques malveillantes. Cet article explique comment effectuer un audit de sécurité et la gestion des journaux d'événements, et fournit des exemples de code pertinents. Audit de sécurité L'audit de sécurité fait référence à une surveillance et une inspection complètes de l'état de sécurité du serveur pour découvrir rapidement les potentiels

Parlons en profondeur du module File dans Node Parlons en profondeur du module File dans Node Apr 24, 2023 pm 05:49 PM

Le module de fichiers est une encapsulation des opérations de fichiers sous-jacentes, telles que l'ajout de lecture/écriture/ouverture/fermeture/suppression de fichiers, etc. La plus grande caractéristique du module de fichiers est que toutes les méthodes fournissent deux versions de **synchrone** et ** asynchrone**, with Les méthodes avec le suffixe sync sont toutes des méthodes de synchronisation, et celles qui n'en ont pas sont toutes des méthodes hétérogènes.

Meilleures pratiques : Guide de réglage des performances pour la création d'un serveur Web sur CentOS Meilleures pratiques : Guide de réglage des performances pour la création d'un serveur Web sur CentOS Aug 04, 2023 pm 12:17 PM

Meilleures pratiques : Guide de réglage des performances pour la création de serveurs Web sur CentOS Résumé : Cet article vise à fournir quelques bonnes pratiques de réglage des performances aux utilisateurs créant des serveurs Web sur CentOS, dans le but d'améliorer les performances et la vitesse de réponse du serveur. Certains paramètres de réglage clés et méthodes d'optimisation couramment utilisées seront présentés, et quelques exemples de codes seront fournis pour aider les lecteurs à mieux comprendre et appliquer ces méthodes. 1. Désactivez les services inutiles lors de la création d'un serveur Web sur CentOS, certains services inutiles seront démarrés par défaut, ce qui occupera des ressources système.

Autorisations et stratégies de contrôle d'accès auxquelles vous devez prêter attention avant de créer un serveur Web sur CentOS Autorisations et stratégies de contrôle d'accès auxquelles vous devez prêter attention avant de créer un serveur Web sur CentOS Aug 05, 2023 am 11:13 AM

Autorisations et stratégies de contrôle d'accès auxquelles vous devez prêter attention avant de créer un serveur Web sur CentOS Dans le processus de création d'un serveur Web, les autorisations et les stratégies de contrôle d'accès sont très importantes. La définition correcte des autorisations et des politiques de contrôle d'accès peut protéger la sécurité du serveur et empêcher les utilisateurs non autorisés d'accéder à des données sensibles ou de faire fonctionner le serveur de manière inappropriée. Cet article présentera les autorisations et les stratégies de contrôle d'accès auxquelles il faut prêter attention lors de la création d'un serveur Web sous le système CentOS, et fournira des exemples de code correspondants. Gestion des utilisateurs et des groupes Tout d'abord, nous devons créer un

Parlons de la boucle d'événements dans Node Parlons de la boucle d'événements dans Node Apr 11, 2023 pm 07:08 PM

La boucle d'événements est un élément fondamental de Node.js et permet une programmation asynchrone en garantissant que le thread principal n'est pas bloqué. Comprendre la boucle d'événements est crucial pour créer des applications efficaces. L'article suivant vous donnera une compréhension approfondie de la boucle d'événements dans Node. J'espère qu'il vous sera utile !

En savoir plus sur les tampons dans Node En savoir plus sur les tampons dans Node Apr 25, 2023 pm 07:49 PM

Au début, JS ne fonctionnait que du côté du navigateur. Il était facile de traiter les chaînes codées en Unicode, mais il était difficile de traiter les chaînes binaires et non codées en Unicode. Et le binaire est le format de données le plus bas du package ordinateur, vidéo/audio/programme/réseau.

See all articles