Node.js入门-知识整理

目的:使用Node.js实现文件上传并将上传的文件显示到浏览器中

基本工具:Node.js,在windows下需要下载cygwin64来运行shell命令

文件:服务器模块、请求路由模块、请求处理程序模块、index.js入口文件

步骤:在目录中创建server.js、router.js、requestHandlers、index.js这文件,分别代表以上几个文件。

  步骤一:在index.js文件中使用require引入以上模块,

const server = require(‘./server‘);
const router = require(‘./router‘);
const requestHandlers = require(‘./requestHandlers‘);

  接着在index.js文件中需要定义路由,我们首先定义一个handle对象,用于保存路由,然后对应请求处理程序模块中的提供的方法(还没写)

//定义路由
let handle = {};
handle[‘/‘] = requestHandlers.start;
handle[‘/start‘] = requestHandlers.start;
handle[‘/upload‘] = requestHandlers.upload;
handle[‘/show‘] = requestHandlers.show;

  最后调用引入的服务器模块提供的方法server.start();并传入两个参数,第一个参数是请求路由模块提供的路径方法router.route,第二个参数是用于定义路由的handle对象

server.start(router.route,handle);

  index.js文件的代码如上

  步骤二:在请求处理程序模块requestHandlers.js文件中,我们需要引入fs模块用于读取文件,formidable模块用于格式化上传的表单

const fs = require(‘fs‘);
const formidable = require(‘formidable‘);

  接着我们来完善之前在index,js文件中对应的方法,在requestHandlers.js文件中,接着写下exports.start方法,这个方法接收一个参数res,届时将在服务器模块中传入该响应参数  

exports.start = (res)=>{//服务器传入的响应参数
    console.log("Request handler ‘start‘ was called.");
    res.writeHead(200, {"Content-Type": "text/html"});//告诉浏览器文件格式
    let body =
    ‘<html>‘+
        ‘<head>‘+
            ‘<meta http-equiv="Content-Type" content="text/html; ‘+
            ‘charset=UTF-8" />‘+
        ‘</head>‘+
           ‘<body>‘+
            ‘<form action="/upload" enctype="multipart/form-data" method="post">‘+//修改文件编码
                ‘<input type="file" name="upload">‘+
                ‘<input type="submit" value="上传文件" />‘+
            ‘</form>‘+
        ‘</body>‘+
        ‘</html>‘;
    res.end(body);//响应浏览器,并将body参数传进入
};
exports.upload = (res,req)=>{//对上传的文件进行处理
    console.log("Request handler ‘upload‘ was called.");
    let form = new formidable.IncomingForm();
    //对上传的文件进行处理
    console.log(‘对上传的文件进行处理‘);
    form.parse(req,(err,fields,files)=>{
        //上传的文件处理完毕
        console.log(‘上传的文件处理完毕‘);
        console.log(files.upload.path);
        fs.renameSync(files.upload.path,"/tmp/test.png");//将路径一的文件保存到路径二
        res.writeHead(200,{"Content-Type":"text/html"});
        res.end("接收到的图片:</br><img src=‘/show/‘>");

    });

//    res.writeHead(200, {"Content-Type": "text/plain"});
//    res.end("You‘ve sent: " + querystring.parse(postData).text);//使用querystring模块获取上传数据中的文本信息
};
exports.show = (res)=>{//从文件中读取数据并显示到页面
    console.log(‘在页面中显示上传数据的请求已被调用‘);
    fs.readFile("/img/test.png","binary",(err,file)=>{
        if(err){
            res.writeHead(500,{"Content-Type":"text/plain"});
            res.end(err+‘\n‘);
        }else {
            res.writeHead(200,{"Content-Type":"image/png"});
            res.write(file,"binary");
            res.end();
        }
    });
};

即对应的处理程序做对应的事情

步骤三:在server文件中,引入url模块用于解析地址,获取当前路径,

const url = require(‘url‘);

接着创建一个对外提供的start方法,并接收两个参数,route和handle,分别用于处理请求路由和路由对象,在该文件中我们还通过url模块提供的parse().pathname获取到了路径地址,然后调用参数传进来的请求路由方法,并传入路由对象、当前路径、接收到的请求req、响应浏览器的res,最后监听端口

exports.start = (route,handle)=>{
    require(‘http‘).createServer((req,res)=>{
            const pathname = url.parse(req.url).pathname;//获取当前路径
            route(handle,pathname,res,req);
            console.log(‘路径名称:‘+pathname);

        }).listen(8888);//监听8888端口
};

步骤四:在router文件中,我们定义一个函数用于该模块提供对外的接口,该函数接收四个参数,路由对象、当前路径、接收到的请求req、响应浏览器的res,在函数中判断当前路径在路由对象中是否存在该函数,如果存在则调用该方法,并传入接收到的请求req、响应浏览器的res两个参数,否则告诉浏览404,页面未找到

exports.route = (handle,pathname,res,req)=>{
    console.log("路径名称 " + pathname);
    if(typeof handle[pathname] === ‘function‘){//匹配是否有这个请求处理程序
         return handle[pathname](res,req);
    }else{
        console.log("No request handler found for " + pathname);
        res.writeHead(404, {"Content-Type": "text/plain"});
        res.end("404 Not found");
    }
};

总体思路:

要把服务器、路由、请求处理程序分开,最后用index.js文件全部连在一起;

①首先创建单独的服务器处理模块,在模块里面创建一个服务器,并通过请求参数和url模块获取到当前的路径,接着调用一个路径处理函数,这个函数传四个参数,第一个参数是从index.js传入的请求处理函数的一个集合对象,第二个参数是当前路径,第三个参数是req,第四个参数是res,最后监听端口,并将这些代码作为一个函数对外开放以方便index.js引入,并且该函数接受两个参数,第一个参数是路径处理函数,第二个参数是请求处理程序函数的对象,服务器模块完成;

②然后创建路径处理模块,该模块将作为一个函数对外开放,函数接收四个参数,第一个参数是从服务器模块传入的请求处理函数的一个集合对象,第二个参数是从服务器模块传入的路径,第三个参数是req,第四个参数是res,然后进行if判断,将从服务器模块传入的路径作为请求处理函数的一个集合对象的参数,判断是否是function,如果是则调用该请求处理程序并传入req,res;

③接着创建请求处理程序,该模块创建不同的对外开放函数,函数参数接收req,res,根据需求制定不同的请求处理程序;

④最后创建一个index.js文件,该文件引入服务器模块,路径处理模块,请求处理程序模块,接着创建一个空对象,把希望制定的路由作为对象的参数然后将对应的请求处理程序模块对应的程序赋值给该参数,最后调用服务器模块对外开放的函数,并传入两个参数,第一个参数是路径处理模块对外的函数,和新创建的的请求处理函数的集合对象。

源教程自:https://www.nodebeginner.org/index-zh-cn.html

原文地址:https://www.cnblogs.com/Liqian-Front-End-Engineer/p/11287862.html

时间: 2024-10-26 14:31:48

Node.js入门-知识整理的相关文章

requirejs入门知识整理

使用模块化开发处理的三大问题: 1.命名冲突:2.繁琐的文件依赖 3.实现异步非阻塞的文件加载,避免网页失去响应 模块化的设计使得JavaScript代码在需要访问“全局变量”的时候,都可以通过依赖关系,把这些“全局变量”作为参数传递到模块的实现体里,在实现中就避免了访问或者声明全局的变量或者函数,有效的避免大量而且复杂的命名空间管理. requirejs以一个相对于baseUrl的地址来加载所有的代码.如果用了data-main属性,则该路径就是baseUrl,baseUrl亦可通过requi

Windows 下 Node.js 入门

例子工程在此下载 Windows 下 Node.js 入门 NodeJS的历史就不说了,别人说过了.最最关键Google JavaScript V8 开发成功,运行效率很高,开放二次开发接口(C++库,功能类似常见的Lua,Python等脚本的的开放库).本来V8主要给Chrome浏览器服务的,经不住运行效率太优秀了,所以就有人动起了开发Native端的JavaScript运行环境的主意.NodeJS是这个思路的产物. 这是官网 https://nodejs.org/ 英文 https://no

Node.js入门:前后端模块的异同

通常有一些模块可以同时适用于前后端,但是在浏览器端通过script标签的载入JavaScript文件的方式与Node.js不同.Node.js在载入到最终的执行中,进行了包装,使得每个文件中的变量天然的形成在一个闭包之中,不会污染全局变量.而浏览器端则通常是裸露的JavaScript代码片段.所以为了解决前后端一致性的问题,类库开发者需要将类库代码包装在一个闭包内.以下代码片段抽取自著名类库underscore的定义方式. 1 (function () { 2 // Establish the

Node.js入门:异步IO

异步IO 在操作系统中,程序运行的空间分为内核空间和用户空间.我们常常提起的异步I/O,其实质是用户空间中的程序不用依赖内核空间中的I/O操作实际完成,即可进行后续任务. 同步IO的并行模式 多线程单进程    多线程的设计之处就是为了在共享的程序空间中,实现并行处理任务,从而达到充分利用CPU的效果.多线程的缺点在于执行时上下文交换的开销较大,和状态同步(锁)的问题.同样它也使得程序的编写和调用复杂化. 单线程多进程 为了避免多线程造成的使用不便问题,有的语言选择了单线程保持调用简单化,采用启

Node.js入门:包结构

JavaScript缺少包结构.CommonJS致力于改变这种现状,于是定义了包的结构规范(http://wiki.commonjs.org/wiki/Packages/1.0 ).而NPM的出现则是为了在CommonJS规范的基础上,实现解决包的安装卸载,依赖管理,版本管理等问题.require的查找机制明了之后,我们来看一下包的细节. 一个符合CommonJS规范的包应该是如下这种结构: 一个package.json文件应该存在于包顶级目录下 二进制文件应该包含在bin目录下. JavaSc

Node.js入门:文件查找机制

文件查找流程图 从文件模块缓存中加载 尽管原生模块与文件模块的优先级不同,但是都不会优先于从文件模块的缓存中加载已经存在的模块. 从原生模块加载 原生模块的优先级仅次于文件模块缓存的优先级.require方法在解析文件名之后,优先检查模块是否在原生模块列表中.以http模块为例,尽管在目录下存在一个http/http.js/http.node/http.json文件,require("http")都不会从这些文件中加载,而是从原生模块中加载. 原生模块也有一个缓存区,同样也是优先从缓存

Node.js入门:模块机制

CommonJS规范  早在Netscape诞生不久后,JavaScript就一直在探索本地编程的路,Rhino是其代表产物.无奈那时服务端JavaScript走的路均是参考众多服务器端语言来实现的,在这样的背景之下,一没有特色,二没有实用价值.但是随着JavaScript在前端的应用越来越广泛,以及服务端JavaScript的推动,JavaScript现有的规范十分薄弱,不利于JavaScript大规模的应用.那些以JavaScript为宿主语言的环境中,只有本身的基础原生对象和类型,更多的对

Node.js入门:事件机制

Evented I/O for V8 JavaScript 基于V8引擎实现的事件驱动IO. 事件机制的实现 Node.js中大部分的模块,都继承自Event模块(http://nodejs.org/docs/latest/api/events.html ).Event模块(events.EventEmitter)是一个简单的事件监听器模式的实现.具有addListener/on,once,removeListener,removeAllListeners,emit等基本的事件监听模式的方法实现

Node.js入门:Node.js&amp;NPM的安装与配置

Node.js安装与配置  Node.js已经诞生两年有余,由于一直处于快速开发中,过去的一些安装配置介绍多数针对0.4.x版本而言的,并非适合最新的0.6.x的版本情况了,对此,我们将在0.6.x的版本上介绍Node.js的安装和配置.(本文一律以0.6.1为例,0.6的其余版本,只需替换版本号即可.从http://nodejs.org/#download可以查看到最新的二进制版本和源代码). Windows平台下的Node.js安装 在过去,Node.js一直不支持在Windows平台下原生