node中,使用回调函数异步加载静态资源

本文介绍了如何在Node.js中使用回调函数解决异步加载静态资源的问题。通过解析请求URL获取文件路径,然后读取文件并根据文件后缀返回对应的MIME类型。当遇到异步读取JSON文件时,通过回调函数将MIME值传递回主流程,确保正确响应。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

var http = require("http");
var fs = require("fs");
var url = require("url");
var path = require("path");

var server = http.createServer(function(req,res){

    // 转为对象,取出pathname

    var pathname = url.parse(req.url).pathname;     //      获取不带参数的路径
    if(pathname.indexOf('.') == -1){                //      是文件夹的话找文件夹下的login.html
        pathname +='/login.html';
    }

    // normalize //变/,也执行..返回上一级什么的
    // 127.0.0.1/images/logo.png
    // ./static/images/logo.png         实际读的是这个文件

    //取后缀名


    var fileURL = './'+path.normalize('./static/'+pathname);
    var extname = path.extname(fileURL);                //      取后缀名 .html .css等

    fs.readFile(fileURL,function(err,data){
        if(err){
            res.writeHead(404, {
                'Content-Type': 'text/html;charset=UTF8'
            });
            res.end('页面没有找到');
        }

        var mime = getMime(extname);                    //  执行函数,不同的后缀名返回不同的值
        res.writeHead(200, {
            'Content-Type': mime
        });
        res.end(data);

    });

});
server.listen(8080,'127.0.0.1');

function getMime(extname){
    // 读json文件,传key 返回value
    fs.readFile('./mime.json',function(err,data){
        if(err){
            throw Error('没找到json文件');
            return;
        }

        // data转为对象类型
        var mimeJson = JSON.parse(data);
        console.log(mimeJson[extname]);
        return mimeJson[extname];
    });

}
发生错误,因为函数是异步的,
var mime = getMime(extname);  还没执行完就往下执行了,解决方法:使用回调函数 回调函数callback把mime值带回来,再往下执行
var http = require("http");
var fs = require("fs");
var url = require("url");
var path = require("path");

var server = http.createServer(function(req,res){

    // 转为对象,取出pathname

    var pathname = url.parse(req.url).pathname;     //      获取不带参数的路径
    if(pathname.indexOf('.') == -1){                //      是文件夹的话找文件夹下的login.html
        pathname +='/login.html';
    }

    // normalize //变/,也执行..返回上一级什么的
    // 127.0.0.1/images/logo.png
    // ./static/images/logo.png         实际读的是这个文件

    //取后缀名


    var fileURL = './'+path.normalize('./static/'+pathname);
    var extname = path.extname(fileURL);                //      取后缀名 .html .css等

    fs.readFile(fileURL,function(err,data){
        if(err){
            res.writeHead(404, {
                'Content-Type': 'text/html;charset=UTF8'
            });
            res.end('页面没有找到');
        }

        //  执行函数,不同的后缀名返回不同的值
        getMime(extname,function(mime){
            res.writeHead(200, {
                'Content-Type': mime
            });
            res.end(data);
        });                    
    });

});
server.listen(8080,'127.0.0.1');

function getMime(extname,callback){
    // 读json文件,传key 返回value
    fs.readFile('./mime.json',function(err,data){
        if(err){
            throw Error('没找到json文件');
            return;
        }

        // data转为对象类型
        var mimeJson = JSON.parse(data);
        console.log(mimeJson[extname]);

        callback(mimeJson[extname]);
    });

}




                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值