node中模块系统及核心模块执行node文件

Posted 苦海123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了node中模块系统及核心模块执行node文件相关的知识,希望对你有一定的参考价值。

node中模块系统:

1.模块系统:核心模块、第三方模块、 自己写的模块。

2.网页中所有的路径都是URL,而不是文件路径。

3.node偏底层开发,开启的服务器完全是一个黑盒子,所有的资源默认都是不能被用户访问的,必须自己编写代码设计开放资源。

4.在node中实现服务器重定向:header(‘location’,‘地址’) , 301----永久重定向 302----临时重定向

5.模块系统:模块作用域 使用require()加载模块 使用exports接口对象导出模块中的成员。

在一个模块中是无法使用另一个模块中的成员的,如果真的需要使用,必须使用exports导出才可以在另一个模块中使用,如:

导出add方法:function add(x,y){

return x + y;

}

exports.ad = add;

6.导出多个成员和导出一个成员:

对于希望被其他模块访问到的成员,必须挂载到exports接口对象中导出,如:exports.a = ‘123’;

exports.b = 3333;

exports.c = function(){};

exports.b = {};

7.默认导出的是一个对象,如果需要导出一个成员那么就要重新赋值:module.exports = ‘新的值’,

module.exports 使用多次也是无效的,因为后面的会覆盖前面的,当然可以使用对象的方式导出多个成员,如:

module.expirts = {

add:function(){},

a:‘123’,

b:123,

c:{},

d:[]

};

8.require()优先从缓存加载,require()每次在加载的时候先在缓存中找是否加载过,如果加载过直接拿来用,否则在加载,体现模块系统的高效。

9.require(’./test.js’)加载自己写的模块时,括号里面是路径,必须以./或者…/开始,不能省略,加载核心模块时括号里面不是路径,直接写模块名就可以。

加载第三方模块时,括号里面写安装的包名,第三方模块实际加载的是:当前文件所在目录中的node_modules目录 --> art-template --> package.json文件中main属性所指向的index.js文件。

在命令窗口执行node.js文件:

在命令行执行node.js代码只需键入:node +文件名(node.js文件不能以node.js命名,文件的后缀名可以省略) 即可,打开命令行的三种方式:

1.window + r -> cmd回车

2.在当前文件目录鼠标右键通过Git打开

3.shift + 鼠标右键 ->在此处打开Powershell窗口,下面将初步介绍几种基本语法和常用模块:

核心模块:

node为js提供很多服务器级别的API,这些API绝大多数被包装到一个具名的核心模块中,例如文件操作的fs模块,http服务构建的http模块,path路劲操作模块;加载模块使用:require(‘模块名’),通过此方法也可以相互加载nodejs文件,更多模块了解可阅读:https://nodejs.org官方文档;如下模块:

	// 在命令窗口打开文件执行以下代码:
    
    // 1.执行简单代码并测试window和document在node中是否存在:
    var str = 'hello';
    console.log(str); //hello
    console.log(window); //ReferenceError: window is not defined at Object.
    console.log(document); //ReferenceError: document is not defined at Object.
    
    
    // 2.载入内置fs文件模块:
    const fs = require('fs');
    fs.readFile('../测试.txt', function(errors, datas) { //readFile读取文件,里面可以传入两参数,第一个为文件路径;第二个为回调函数(回调函数中第一个参数为读取失败时的错误对象,读取成功时为null;第二个参数为读取成功时的数据,读取失败时为undefined)
        if (errors) {
            console.log('文件读取失败!');
            return false;
        } else {
            console.log('读取文件内容为:' + datas); //有的时候可能会返回二进制数据经计算机转为十六进制数据,此时可以使用.toString()将其转为我们可以认识的字符
        };
    });
    
    fs.writeFile('./<>.txt', '苦海1', function(error) { //writeFile写入文件,里面可传入三个参数,一为文件路径;二为写入文件的字符;三为回调函数(回调函数中只有一个参数,写入成功时为null,写入失败时为错误对象),注意:如果没有路径指向的文件,则会自动创建文件并写入内容,除非文件命名失败才会写入失败。
        if (error != null) console.log('文件写入失败!');
    });
    
    fs.readdir('./lib', function(error, data) { //文件路径:用于访问指定路径下的文件,第一个参数表示要访问到额路径;第二个参数是回调函数(回调函数中第一参数表示访问失败时的错误对象,第二个参数表示访问成功时的成功对象)
        console.log(error); //当访问成功时,error对象是null;访问失败时此对象是错误对象
        console.log(data); //当访问成功时,以数组的形式返回当前目录下的文件结构;访问失败时返回undefined
    });
    
    
    // 3. 载入内置http模块:所有联网的程序都要进行网络通信,计算机中只有一个物理网卡,而且同一个局域网中,网卡的地址必须是唯一的,网卡通过唯一的IP地址来定位; IP定位到具体的电脑,端口号定位到具体的应用程序,所有联网的软件都会占用一个端口号。
    const http = require('http');
    const server = http.createServer(); //使用createServer创建一个web服务器
    server.on('request', function(request, response) { //给server注册请求事件request,回调函数中可以传入两个参数,第一个为请求对象,第二个额为响应对象;它们中有几个比较重要的属性,如下:
        response.write('<h1>Hellow,this is .write()API</h1>'); //响应给浏览器的内容,此方法需要配合response.end()方法才可以实现效果;当然实际推荐只使用end方法也是可以实现相同的效果的,前提是将响应内容传入end括号中:
        response.end('<h1>Hellow,this is .write()API in end</h1>'); //将响应内容直接传入end中可以省略writer方法
      	response.setHeader('Content-Type', 'text/plain;charset=utf-8'); //浏览器默认编码与相应的编码不一致时会乱码,这里.setHeader()设置响应头中Content-Type,不同的资源对应的 Content-Type 是不一样的,可以到这里查询:http://tool.oschina.net/commons
      	request.socket.remoteAddress; //.socket.remoteAddress获取用户IP地址
      	request.socket.remotePort; //.socket.remotePort获取用户端口号
      
      	response.statusCode = 302;//设置响应状态码,302为临时重定向
        response.setHeader('Location', '/');//页面重定向
      
      	request.url; //返回浏览器输入url中端口号后面的值,可以利用它做路径逻辑响应,如:
        var requestUrl = request.url;
        if (requestUrl === '/' || requestUrl === '/index.html') {
            response.end('index.html');
        } else if (requestUrl === '/login') {
            response.end('login.html');
        } else {
            response.end('<h5>404 NOT FOUND!</h5>');
        };
    });
    server.listen(4000, function() { //绑定端口号,启动服务,在浏览器使用localhost:4000就可以访问到此服务响应
        console.log('http服务器启动成功了');
    });
    
    
    // 4.url模块:
    var url = require('url'); //载入url模块
    var result = url.parse('127.0.0.1:3000/test.html?name=jack&age=18', true); //以对象的方式解析URL地址,后面的参数默认为false,当为true时,?后面的内容将以对象的方式呈现,如下案例:
    console.log(result);
    /*Url {
      protocol: '127.0.0.1:',
      slashes: null,
      auth: null,
      host: '3000',
      port: null,
      hostname: '3000',
      hash: null,
      search: '?name=jack&age=18',
      query: [Object: null prototype] { name: 'jack', age: '18' },
      pathname: '/test.html',
      path: '/test.html?name=jack&age=18',
      href: '127.0.0.1:3000/test.html?name=jack&age=18'
    }*/
    console.log(result.query); //直接获取?后面的参数 { name: 'joke', message: 'hellow' }

实现Apache功能:

	 //简单实现Apache功能
    // 1.加载http和fs模块:
    var http = require('http');
    var fs = require('fs');
    
    // 2.创建一个浏览器服务:
    var server = http.createServer();
    
    // 定义个路径的变量:
    var urldir = '/www'
    // 3.绑定请求事件:
    server.on('request',function(request,response){
      // 获取请求的路径:
      var url = request.url;
      // 判断请求的路径并做出响应
      if (url==='/') {
        fs.readFile(urldir + '/index.html',function(error,data){
          if (error) {
            return response.end('404 Not Found');
          }; 
          response.end(data);
        });
      } else if (url==='/index.html') {
        fs.readFile(urldir + '/index.html',function(error,data){
          if (error) {
            return response.end('404 Not Found');
          }; 
          response.end(data);
        });
      } else if (url==='/test.txt') {
        fs.readFile(urldir + '/test.txt',function(error,data){
          if (error) {
            return response.end('404 Not Found');
          }; 
          response.end(data);
        });
      } else if (url==='/login.html') {
        fs.readFile(urldir + '/login.html',function(error,data){
          if (error) {
            return response.end('404 Not Found');
          }; 
          response.end(data);
        }); 
      };
    
    });
    // 4.监听端口号:
    server.listen(3000,function(){
      console.log('running...');
    });
    
    
    
    像Apache一样找文件:
    var http = require('http');
    var fs = require('fs');
    var urldir = 'www/';
    var server = http.createServer();
    server.on('request', function(request, response) {
        var url = request.url;
        var indurl = '/index.html'
        if (url !== '/') {
            indurl = url;
        };
        fs.readFile(urldir + indurl, function(error, data) {
            if (error) {
                return response.end('404 Not Found!');
            };
            response.end(data);
        });
    });
    server.listen(3000, function() {
        console.log('running...');
    });

提示:本文图片等素材来源于网络,若有侵权,请发邮件至邮箱:810665436@qq.com联系笔者删除。
笔者:苦海

以上是关于node中模块系统及核心模块执行node文件的主要内容,如果未能解决你的问题,请参考以下文章

深入浅出Node.js 模块机制

模块

Node-模块加载及包

使用node.js中fs模块的copyFileSync方法复制文件报错“operation not permitted, copyfile ‘G: est.txt‘ -> ‘G:Trash‘“(代码片

Node.js 核心模块学习

「Node学习笔记」Node.js的模块实现及编译