我正在构建自己的系统,以便使用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
您可以使用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/