提问者:小点点

在nodejs上构建自定义动态和静态文件传递


我正在构建自己的系统,以便使用http服务器在节点js上交付静态和动态文件。 我知道这个中间件并不复杂。 所以我所寻求的是实现我自己的方式在nodejs上交付静态和动态文件。 在下面的代码中,我创建了一个HTTP服务器。 服务器根据counter变量读取两种类型的文件

   1- Dynamic file (myhtml.html) when  counter =  1 
   2- Static files(images, scripts etc.. )  when counter > 1 . Located on directory /public

它工作得很好,但是当我在第一次请求之后再次刷新web页面时会出现问题,因为每次传递文件(静态或动态)时,计数器值已经递增。 因此,对于后续请求,counter的初始值不再是0,因此传递错误404,并带有消息file not found

注意:如果我刷新服务器,那么一切都可以正常工作,因为计数器是0。

因此,我的问题是如何使计数器等于0,当所有文件都在一个http请求后被传递时,这样对于下一个请求,计数器=0

var http = require("http");
var root = __dirname;
var mime = require("mime");
var path = require("path") ;
var fs   = require("fs");
function deliverDynamicFile(file, res, req, type){
   readAndSendFile(file, req, res, type)
}

function deliverStaticFile(res, req, type){
   let static = path.join(root,"public");  // ex : static =  root/public/
   let file = path.join(static,req.url);  // ex  : file = root/public/images/java.jpeg

   readAndSendFile(file, req, res, type)
}

function readAndSendFile(file, req, res, type){
   fs.readFile(file,(err,data)=>{
     if(err) {
        res.writeHead(404,{"content-type":"text/plain"});
        res.end("file not found") 
     }
     else  {
       
        res.writeHead(200,{"content-type":type});
        res.end(data) 
     }
   })
}

let counter = 0 ;
var server = http.createServer( function(req,res){
   let url = req.url ;
   counter++;  // increment counter for each request
   let file = path.join(root,url) ;
   let mimeType = mime.lookup(path.basename(file));

   if (counter == 1 ){
      deliverDynamicFile(file,res, req, mimeType)
   }else{
      // deliver files on directory `public`
      deliverStaticFile(res, req, mimeType)
   }
 });

  
server.listen(3000);

我的html文件:myhtml.html

<!DOCTYPE HTML>
<html>
  <head>
    <title> RAW REQUEST</title>
    <script src="/handlebars/handlebars-v4.5.3.js"></script>
 </head>
   <body>
     <h1>Hello raw REQUEST</h1>
     <img src="/images/java.jpeg" width="200px" height="200px">
   </body>
 </html>

我的应用程序目录

server.js
myhtml.html
public/
- - images/
- - - - -java.jpeg
- - handlebars/
- - - - -handlebars-v4.5.3.js

共1个答案

匿名用户

您可以使用modulo运算符检查是否存在这样的错误:

var http = require("http");
var root = __dirname;
var mime = require("mime");
var path = require("path") ;
var fs   = require("fs");
function deliverDynamicFile(file, res, req, type){
   readAndSendFile(file, req, res, type)
}

function deliverStaticFile(res, req, type){
   let static = path.join(root,"public");  // ex : static =  root/public/
   let file = path.join(static,req.url);  // ex  : file = root/public/images/java.jpeg

   readAndSendFile(file, req, res, type)
}

function readAndSendFile(file, req, res, type){
   fs.readFile(file,(err,data)=>{
     if(err) {
        res.writeHead(404,{"content-type":"text/plain"});
        res.end("file not found") 
     }
     else  {
       
        res.writeHead(200,{"content-type":type});
        res.end(data) 
     }
   })
}

let counter = 0 ;
var server = http.createServer( function(req,res){
   let url = req.url ;
   counter++;  // increment counter for each request
   let file = path.join(root,url) ;
   let mimeType = mime.lookup(path.basename(file));

   if (counter % 2 == 1 ){
      deliverDynamicFile(file,res, req, mimeType)
   }else{
      // deliver files on directory `public`
      deliverStaticFile(res, req, mimeType)
   }
 });

  
server.listen(3000);

这样,对于每个请求,您检查计数器的模2的结果。 如果结果是1,你就做你想做的。

另见:https://www.tutorialsmade.com/javascript-find-odd-even-number/