Maison  >  Article  >  interface Web  >  Nodejs construit un serveur d'images

Nodejs construit un serveur d'images

王林
王林original
2023-05-16 20:29:06760parcourir

Dans la conception de sites Web modernes, qu'il s'agisse d'un site Web personnel ou d'un site Web d'entreprise, un grand nombre de ressources d'images sont nécessaires. Par conséquent, comment stocker et distribuer efficacement ces ressources d’images est devenu l’un des problèmes auxquels de nombreux administrateurs ou développeurs de sites Web doivent faire face. Dans ce cas, un serveur d’images efficace peut résoudre le problème. Cet article explique comment utiliser nodejs pour créer un serveur d'images efficace.

  1. Implémentation d'un serveur Web simple
    Nodejs est un environnement d'exécution JavaScript piloté par événements pour créer des applications Web rapidement et de manière évolutive. Dans cet article, nous utiliserons le module http de Nodejs pour créer un serveur Web simple.

Nous pouvons créer un serveur Web simple grâce au code suivant :

const http = require('http');

const server = http.createServer((req, res) => {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.write('Hello World!');
  res.end();
});

server.listen(3000, () => {
  console.log('Server running at http://localhost:3000/');
});

Le code ci-dessus utilise la méthode createServer() dans le module http pour créer un serveur Web Lorsqu'un client se connecte au serveur, le serveur ". La chaîne Hello World!" est envoyée au client et reste sur le client jusqu'à la fin du serveur.

  1. Implémentation d'un serveur d'images
    Pour un serveur d'images, nous devons modifier le code ci-dessus et ajouter quelques fonctions spécifiques pour traiter et distribuer les images.
const http = require('http');
const fs = require('fs');
const path = require('path');

const server = http.createServer((req, res) => {
  // 获取请求文件的后缀名
  const extname = path.extname(req.url);
  // 如果后缀名是.jpg或.png
  if (extname === '.jpg' || extname === '.png') {
    // 读取文件
    fs.readFile('./images' + req.url, (err, data) => {
      if (err) {
        // 文件不存在,返回404错误
        res.writeHead(404, {'Content-Type': 'text/plain'});
        res.write('404 Not Found');
        res.end();
      } else {
        // 返回文件内容
        res.writeHead(200, {'Content-Type': 'image/jpeg'});
        res.write(data);
        res.end();
      }
    });
  } else {
    // 请求的不是图片,返回404错误
    res.writeHead(404, {'Content-Type': 'text/plain'});
    res.write('404 Not Found');
    res.end();
  }
});

server.listen(3000, () => {
  console.log('Server running at http://localhost:3000/');
});

Le code ci-dessus utilise le module fs dans Nodejs pour lire le fichier image dans le répertoire spécifié, puis renvoie les données binaires du fichier au client. Si une ressource non-image est demandée, une erreur 404 sera renvoyée.

  1. Optimisation des performances du serveur d'images
    Afin d'améliorer les performances du serveur d'images, nous pouvons utiliser le mécanisme de mise en cache de Nodejs pour réduire le nombre d'opérations d'E/S de fichiers, augmentant ainsi la vitesse d'accès.

Ce qui suit est une implémentation simple du cache :

const http = require('http');
const fs = require('fs');
const path = require('path');
const LRU = require('lru-cache');

const cacheOptions = {
  max: 500, // 最多缓存500个对象
  length: (n, key) => n * 2 + key.length, // 缓存对象的大小
  dispose: (key, n) => n.close(), // 执行垃圾回收
  maxAge: 1000 * 60 * 60 // 缓存1小时
};
const imgCache = new LRU(cacheOptions);

const server = http.createServer((req, res) => {
  // 获取请求文件的后缀名
  const extname = path.extname(req.url);
  // 如果后缀名是.jpg或.png
  if (extname === '.jpg' || extname === '.png') {
    // 检查缓存中是否已经有该文件的缓存
    const imgData = imgCache.get(req.url);
    if (imgData) {
      // 直接从缓存中返回文件的二进制数据
      res.writeHead(200, {'Content-Type': `image/${extname.slice(1)}`});
      res.write(imgData, 'binary');
      res.end();
    } else {
      // 如果缓存中没有该文件的缓存,则读取文件并将其添加到缓存中
      fs.readFile('./images' + req.url, 'binary', (err, data) => {
        if (err) {
          // 文件不存在,返回404错误
          res.writeHead(404, {'Content-Type': 'text/plain'});
          res.write('404 Not Found');
          res.end();
        } else {
          // 返回文件内容
          res.writeHead(200, {'Content-Type': `image/${extname.slice(1)}`});
          res.write(data, 'binary');
          res.end();
          // 将文件数据添加到缓存中
          imgCache.set(req.url, data);
        }
      });
    }
  } else {
    // 请求的不是图片,返回404错误
    res.writeHead(404, {'Content-Type': 'text/plain'});
    res.write('404 Not Found');
    res.end();
  }
});

server.listen(3000, () => {
  console.log('Server running at http://localhost:3000/');
});

Le code ci-dessus utilise le cache LRU dans Nodejs pour mettre en cache les données binaires des fichiers image. De cette façon, lorsque plusieurs clients demandent la même image, le serveur n'a besoin de lire le fichier image qu'une seule fois et de l'ajouter au cache, et de le lire directement à partir du cache lors des requêtes ultérieures, réduisant ainsi considérablement le nombre d'E/S de fichier. des opérations augmente la vitesse d’accès.

  1. Déployer et exécuter le serveur d'images
    Pour déployer et exécuter le serveur d'images, vous devez d'abord installer nodejs et npm, puis exécuter les commandes suivantes :
npm init
npm install http fs path lru-cache --save
node server.js

Parmi elles, la commande npm init générera un package. json et la commande npm install téléchargera et installera tout. Les bibliothèques dépendantes requises sont requises et la commande node server.js consiste à exécuter le serveur d'images.

Il convient de noter que dans un environnement de production réel, les images ou autres ressources statiques doivent être stockées dans des périphériques de stockage indépendants ou des nœuds CDN pour améliorer la vitesse d'accès et la disponibilité des images.

Résumé :
Cet article explique comment utiliser nodejs pour créer un serveur d'images efficace et fournit quelques méthodes d'optimisation des performances. J'espère que cela aide les développeurs.

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:
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