Node.js入门

目录

一、安装Node.js和npm        二、运行Node程序        三、模块

四、内置模块    1、fs    2、stream    3、http    4、crypto


参考廖雪峰的Node.js  Node入门  CNode社区 《深入浅出Node.js》(理解原理底层)等。

Node.js是一个基于Chrome V8引擎的JavaScript运行时环境,不是新语言也不是框架。不同于浏览器中的JavaScript,Node.js中的JavaScript没有BOM和DOM,只有ECMAScript。Node.js为JavaScript提供一些服务器级别的API。

Node.js主要用于Web服务器和命令行工具(npm、webpack、gulp等)的开发。

io.js和Node.js是兼容的,新特性首先添加至io.js,如果测试通过再把新特性添加至Node.js,Node.js是线上稳定版。

一、安装Node.js和npm

Node.js官网下载对应平台的安装程序,安装时务必选择全部组件,包括勾选Add to Path。

在命令行输入node --version或node -v,显示版本号则表明Node环境安装成功。

在命令行输入npm -v,输出版本号表明npm安装成功。npm是Node.js的包管理工具(package manager),大家把自己开发的模块打包后放到npm官网上,如果要使用直接通过npm安装就可以,另外npm会根据依赖关系把所有依赖的包都下载管理起来。npm包管理工具

二、运行Node程序

(1)交互模式

在命令行输入node,启动Node解释器,输入任意JavaScript语句,回车后将得到输出结果(输入一行执行一行)。

连按两次Ctrl+C退出Node.js环境。

(2)运行.js文件

文本编辑器:绝对不能用Word和写字板,可用Sublime Text或Notepad++编写JS代码,用UTF-8格式保存。

// hello.js
console.log('Hello world!');

在对应目录下输入node hello.js,一次性把.js源代码交给Node解释器执行。

在JS文件的第一行添加'use strict',或执行时输入node --use_strict hello.js开启严格模式。

(3)IDE

选择Visual Studio Code运行和调试.js。在VS Code中打开文件夹作为工程目录,所有的JS文件都存放在该目录下。调试时,打开launch.json配置文件(.vscode配置目录下),可修改文件名,之后即可调试JS文件。

{
  "version": "0.2.0",
  "configurations": [
    {
      "type": "node",
      "request": "launch",
      "name": "Launch Program",
      "program": "${workspaceFolder}/hello.js"
    }
  ]
}

三、模块

在Node中,一个.js文件称为一个模块(module),模块名就是文件名。使用模块大大提高了代码的可维护性;编写代码不必从零开始,可以引用Node内置的模块和来自第三方的模块等;避免函数名和变量名冲突。

module.exports = variable;在模块中对外输出变量(对象、函数、数组等)。

var foo = require('module_name');引入其它模块输出的对象。注意模块的相对路径,如果只写模块名,Node会依次在内置模块、全局模块和当前模块下查找,找不到会报错。

// hello.js
var s = 'Hello';

function greet(name) {
    console.log(s + ', ' + name + '!');
}

module.exports = greet; // 模块的输出
// main.js
var greet = require('./hello'); // 引入hello模块

var s = 'Michael';
greet(s); // Hello, Michael!

四、内置模块

Node.js运行在服务器端,没有浏览器的安全限制,且须接收网络请求、读写文件、处理二进制内容等,所以Node.js内置的常用模块就是为了实现基本的服务器功能。它们的底层代码是用C/C++在Node.js运行环境中实现的,不能在浏览器运行。

global:在Node.js中,也有唯一的全局对象global。

process:是Node.js提供的一个对象,代表当前Node.js进程,可以拿到许多有用信息。

  

process.nextTick():在下一次事件响应中执行代码。JavaScript、Node.js程序是由事件驱动执行的单线程模型,Node.js不断执行响应事件的JavaScript函数,直到没有任何响应事件的函数可以执行时退出。

// test.js
process.nextTick(function () { // 在下一轮事件循环中调用
    console.log('nextTick callback!');
});
console.log('nextTick was set!');
// nextTick was set!
// nextTick callback!

process.on():Node.js进程本身的事件由process对象处理。

process.on('exit', function (code) { // 响应exit事件,程序即将退出时的回调函数
    console.log('about to exit with code: ' + code);
});

判断JavaScript执行环境,常用的方式是根据浏览器和Node环境提供的全局变量名称来判断。

if (typeof(window) === 'undefined') {
    console.log('node.js');
} else {
    console.log('browser');
}

1、fs

fs模块是文件系统(file system)模块,负责读写文件。

与所有其它JS模块不同的是,fs模块同时提供了异步和同步的方法。绝大部分需要在服务器运行反复执行业务逻辑的代码,必须使用异步代码,否则同步代码执行时期服务器将停止响应。服务器启动时如果需要读取配置文件,或者结束时需要写入到状态文件时,可以使用同步代码,这些代码只在启动和结束时执行一次。

(1)异步读文件

执行IO操作时,JS代码无需等待,传入回调函数后继续执行后续JS代码。

sample.txt文件必须在当前目录下,且文件编码为utf-8。传入的回调函数接收两个参数,第一个参数代表错误信息,第二个参数代表结果。正常读取时,err为null,data为读取到的String;读取发生错误时,err代表一个错误对象,data为undefined。

如果要读取的文件是二进制文件,如图片文件,此时不传入文件编码时,回调函数的data参数将返回一个Buffer对象(一个包含零个或任意个字节的数组,注意和Array不同)。Buffer对象可以和String作转换。

var fs = require('fs');

fs.readFile('sample.txt', 'utf-8', function (err, data) {
    if (err) {
        console.log(err);
    } else {
        console.log(data);
        console.log(data.length + ' bytes');

        var buf = Buffer.from(data, 'utf-8'); // String -> Buffer
        var text = buf.toString('utf-8'); // Buffer -> String   
    }
});

(2)同步读文件

同步读文件不接收回调函数,函数直接返回结果。如果同步读文件发生错误,则需要用try...catch捕获。

var fs = require('fs');

var data = fs.readFileSync('sample.txt', 'utf-8');
console.log(data);

(3)写文件

参数依次为文件名、数据和回调函数(只有一个err参数)。如果传入的数据是String,默认按UTF-8编码写入文本文件;传入Buffer对象,则写入的是二进制文件。

var fs = require('fs');

var data = 'Hello, Node.js';
fs.writeFile('output.txt', data, function (err) {
    if (err) { // 比如文件名不合法
        console.log(err);
    } else {
        console.log('ok.');
    }
});

 writeFileSync()同步写文件。

(4)获取详细信息stat

fs.stat()返回一个Stat对象,包含文件或目录的详细信息。

var fs = require('fs');

fs.stat('sample.txt', function (err, stat) {
    if (err) {
        console.log(err);
    } else {
        console.log('isFile: ' + stat.isFile()); // 是否是文件
        console.log('isDirectory: ' + stat.isDirectory()); // 是否是目录
        if (stat.isFile()) {
            console.log('size: ' + stat.size); // 文件大小
            console.log('birth time: ' + stat.birthtime); // 创建时间, Date对象
            console.log('modified time: ' + stat.mtime); // 修改时间, Date对象
        }
    }
});
// isFile: true
// isDirectory: false
// size: 5
// birth time: Fri Mar 01 2019 23:11:56 GMT+0800 (GMT+08:00)
// modified time: Fri Mar 01 2019 23:16:25 GMT+0800 (GMT+08:00)

statSync()同步获取详细信息。 

2、stream

流是一种抽象的数据结构,可以把数据看成是数据流。从键盘输入到应用程序,称为标准输入流(stdin);如果应用程序把字符一个一个输出到显示器上,称为标准输出流(stdout)。流的特点是数据是有序的,而且必须依次读取或写入,不能像Array那样随机定位。

待更新。。。

3、http

Node.js自带的http模块用于开发HTTP服务器程序,可以处理TCP连接、解析HTTP等,使应用程序并不直接和HTTP协议打交道。

http.createServer([options][, requestListener])返回新建的http.Server实例。参数options是一个对象。参数requestListener是自动添加到request事件的函数,request事件每次有请求时都会触发,每个连接可能有多个请求。requestListener函数接收两个参数,request对象包含所有HTTP请求的信息,response对象封装了HTTP响应的信息。

response.write(chunk[, encoding][, callback])给客户端发送响应数据

response.end([data][, encoding][, callback])向服务器发出信号,表明已发送所有响应头和主体,该服务器应该视为此消息已完成。 必须在每个响应上调用此方法。

如果指定了 data,则相当于调用 response.write(data, encoding) 之后再调用 response.end(callback)

如果指定了 callback,则当响应流完成时将调用它。

用Node.js实现一个HTTP服务器程序非常简单。我们来实现一个最简单的Web程序hello.js,它对于所有请求,都返回Hello world!

 

var http = require('http'); // 导入http模块

var server = http.createServer(function (request, response) { // 创建http server,回调函数接收request和response对象
    console.log(request.method + ': ' + request.url);
    response.writeHead(200, {'Content-Type': 'text/html'});
    response.end('<h1>Hello world!</h1>');
});

server.listen(8080); // 让服务器监听8080端口
console.log('Server is running at http://127.0.0.1:8080/');
// Server is running at http://127.0.0.1:8080/
// GET: /
// GET: /favicon.ico

4、crypto

 

B/S编程模型(Browser-Server)Node是该编程模型的一个工具、模块化编程 RequireJS SeaJS @import、Express开发框架

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值