Node学习7-搭建项目/http模块

1、在git上创建一个项目,并git clone把文件夹拉下来。

readme文件。

2、在文件夹里面,创建一个src文件夹。

src里面创建一个app.js作为项目入口即可。

然后node app.js就把整个项目跑起来了。

调试

点左边的小虫子,设置断点

 开始调试

去浏览器访问

 http://127.0.0.1:3000/a/b/c/d.js

修改某个文件后,直接刷新网页就能看到效果

//-g 安装到全局
npm install -g supervisor

代替node来使用

原来代码

//读配置文件
const http = require('http');
const conf = require('./config/serverConfig.js');

//创建服务器
//匿名函数是req事件的处理函数
const server = http.createServer((req,res)=>{

    //返回头
    res.statusCode=200;
    res.setHeader('Content-Type','text/plain');
    res.end('Hello World');


});

//绑定名称与端口
//回调函数可有可无
server.listen(conf.port,conf.hostname);

 修改了字符串,自需要Ctrl+s保存修改文件,刷新页面就会生效。

其实127.0.0.1:3000就是root路径,就是app.js所在目录

http://127.0.0.1:3000/a/b/c/d.js返回Hello World是因为给每个req的处理函数都是一样的!

输出浏览器的访问路径

相当于root跟路径

//相当于pwd
console.info('当前文件所在路径:'+process.cwd());

因为用户访问的是app.js,然后app.js就是在src里面的

用户访问路径

其实就是url啊

console.info('用户访问的相对路径:'+req.url);

//join会修复一些路径问题
//比如上面是/,后来变成了
var filePath = path.join(process.cwd(),req.url);
console.log('绝对路径'+filePath);

能看到第一个已经正确了。但是似乎有两个请求.

这个favicon是网页上的小图标,那么我们也加上去看看吧

加这个

但是发现还是没有哇!

一看原来favicon的请求还是Hello World

因为程序里写死了

改动一下,发现了一个典型的错误

if(req.url=='/favicon.ico'){
        console.log('/favicon.ico');
        fs.readFile('./favicon.ico',(err,data)=>{

            if(err){
                console.log(err);
            }else{
                res.statusCode=200;
                res.setHeader('Content-Type','image/x-icon');
                res.write(data);
                res.end();
            }

        })
    }
    

    //返回头
    res.statusCode=200;
    res.setHeader('Content-Type','text/plain');
    res.end('Hello World!!!!!!!');
    console.log('当前文件所在路径:'+process.cwd());
    console.log('用户访问的相对路径:'+req.url);
    var filePath = path.join(process.cwd(),req.url);
    console.log('绝对路径'+filePath);

为什么呢?

因为没有理解好异步的思想。

因为访问图片,所以if语句是肯定会进入的。

接下来就会读取文件,由于是异步的,文件读取完之前就会执行后续操作了(返回Hello World)。

所以一个办法就是把后面的加上else。

//读配置文件
const http = require('http');
const path = require('path');
const fs = require('fs');
const conf = require('./config/serverConfig.js');

//创建服务器
//匿名函数是req事件的处理函数
const server = http.createServer((req,res)=>{

    if(req.url=='/favicon.ico'){
        console.log('/favicon.ico');
        fs.readFile('./favicon.ico',(err,data)=>{

            if(err){
                console.log(err);
            }else{
                res.statusCode=200;
                res.setHeader('Content-Type','image/x-icon');
                res.write(data);
                res.end();
            }

        })
    }else{
         //返回头
        res.statusCode=200;
        res.setHeader('Content-Type','text/plain');
        res.end('Hello World!!!!!!!');
        console.log('当前文件所在路径:'+process.cwd());
        console.log('用户访问的相对路径:'+req.url);
        var filePath = path.join(process.cwd(),req.url);
        console.log('绝对路径'+filePath);
    }

这样就ok了

页面上也正常显示了

/*********************回到正题***********************/

用户的url,就是他要看的文件

那么内容只需要读取那个文件,再返回给前端就好了

//把访问的绝对路径拼出来
        var filePath = path.join(process.cwd(),req.url);
        console.log('绝对路径'+filePath);
        //查看访问的这个路径的信息
        //如果访问127.0.0.1:3000的话,其实就是访问的当前根目录,因为url是空or
        fs.stat(filePath,(err,stats)=>{

            if(err){
                res.statusCode=404;
                res.setHeader('Content-Type','text/plain');
                res.end(filePath+'is not exsit!');
                //结束这个函数
                return;
            }

            //如果是文件,显示内容
            if(stats.isFile()){
                res.statusCode=200;
                res.setHeader('Content-Type','text/plain');
                //当然用readFile也可以,但是对于浏览器来说,流的方式是最快的
                fs.createReadStream(filePath).pipe(res);
            }else if(stats.isDirectory()){
                //如果是目录,返回文件列表
                fs.readdir(filePath,(err,files)=>{

                    res.statusCode=200;
                    res.setHeader('Content-Type','text/plain');
                    //files是string[],join是用,分割并返回字符串
                    res.end(files.join(','));

                });
            }



        });

超好用的api,如果是文件的话,就会返回一个文件数组.

readdir

/***********将项目的异步回调全部改写*****************/

async前缀定义的function中可以使用await来等待Promise完成

其实就是异步函数要使用promisify来封装

然后通过async来定义一个函数,在里面通过await等待函数完成再进行下一步,不然函数返回的是promise

原文地址:https://www.cnblogs.com/weizhibin1996/p/9291578.html