zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    如何掌握所有的程序语言
    程序与证明
    卫星通信地面系统构成
    SCIP 环境搭建
    Homebrew install.sh
    macOS 内核之从 I/O Kit 电量管理开始
    matlab练习程序(空间椭圆拟合)
    多进程抢票加锁
    进程间数据传递
    队列用法
  • 原文地址:https://www.cnblogs.com/weizhibin1996/p/9291578.html
Copyright © 2011-2022 走看看