nodejs基础

nodejs允许自己封装模块,使得编写程序可以模块化,便于维护整理。在一个js文件中写完封装的函数或对象后,可以使用exports或module.exports来将模块中的函数暴露给程序,使得整个程序可以使用,如:

function HelloWorld() {
return 'Hello, node-js!';
} module.exports.HelloWorld = HelloWorld;

要使用其他模块中的方法时,需要使用require来导入模块,如:

const http = require('http');
const helloWorld = require('./helloword');

再说回exports和module.exports,两者的功能相同,区别在于,exports是module.exports的缩略写法,如下写法是相同意思:

module.exports.HelloWorld = HelloWorld;
exports.HelloWorld = HelloWorld;

创建简单的nodejs服务器

nodejs封装由http模块实现服务器功能,只需引入使用即可,代码如下:

const http = require('http');
const helloWorld = require('./helloword'); var server = http.createServer(function(req, res) {
if (req.method != 'GET') {
res.statusCode = 404;
res.end('Please Use GET method!');
}
else
res.end(helloWorld.HelloWorld());
}); server.listen(30000);
console.log('Server is started on 30000 port……');

先导入http模块,然后使用createServer方法,在方法中传入回调函数来处理用户请求。

回调函数由两个参数req和res,代表着请求和响应。

req的属性有:req.method、req.url。res可以使用setHeader('http响应头','参数')方法来设置响应头参数,使用res.statusCode = 200来设置响应状态码

在回调函数的最后,需要调用res.end()来结束回调函数的响应。

创建静态文件服务器

要搭建静态文件服务器,需要将引入nodejs自带的fs模块进行文件的读取,并将读取到的文件数据以数据流的形式传输到浏览器端,代码如下:

const http = require('http');
const url = require('url');
const fs = require('fs');
const path = require('path'); const root = __dirname; var server = http.createServer(function(req, res) {
var filePath = path.join(root, url.parse(req.url).pathname);
var stream = fs.createReadStream(filePath);
// stream.on('data', function(chunk) {
// res.write(chunk);
// })
// stream.on('end', function() {
// res.statusCode = 200;
// res.end();
// })
stream.pipe(res);
}); server.listen(3000);
console.log('Server is started on 3000 port……');

一步步来分析,__dirname为nodjs中的一个自带的属性变量,值为当前js文件所在的目录路径,在使用url模块的parse方法后,提取其中的pathname,使用path.join()方法将其组合成访问文件的绝对路径来对文件进行读取。不过这里需要一个异常处理,否则若访问文件不存在,没有异常处理则程序异常退出。

    stream.on('error', function(err){...})

使用fs.createReadStream()方法来创建读取文件数据流,这时有两种方法对文件数据进行读取:


var stream = fs.createReadStream(filePath);
// 1.
stream.on('data', function(chunk) {
res.write(chunk);
})
stream.on('end', function() {
res.statusCode = 200;
res.end();
}) // 2.
stream.pipe(res);

第一种方法为设置事件监听器,写入回调函数,在on('data',function(){})中将文件数据块写入响应,在on('data',function(){})中结束响应处理

第二中方法为nodejs的高级机制,创建数据流后通过pipe()函数将数据流用管道接到WriteStream,且会在其中自动调用res.end()功能。任何ReadStream都能通过pipe()接到WriteStream中。

Events

Node.js有多个内置的事件,我们可以通过引入events模块,并通过实例化EventEmitter类来绑定和监听事件,如下:

var event = require('events');
var eventEmitter = new events.EventEmitter();
var eventHandler = function(args){...};
eventEmitter.on('eventName',eventHandler);
eventEmitter.emit('eventName',args...);

Buffer

Buffer类用于在 TCP 流或文件系统操作等场景中处理字节流。

官方建议构造方法:

  • Buffer.from(buffer)
  • Buffer.from(array)
  • Buffer.from(string[,encoding])
  • Buffer.alloc(size)
  • Buffer.allocUnsafe(size)

Buffer对象的操作方法:

  • write(string[, offset[, length]][, encoding])
  • toString([encoding[, start[, end]]])
    • ascii
    • utf8
    • base64
    • hex
  • toJSON()

Stream

Stream 是一个抽象接口,Node 中有很多对象实现了这个接口。

所有Stream对象都是EventEmitter的实例。常用事件:

  • data
  • end
  • finish
  • error

pipe()方法可将从writeStream流到另一个流中,且可以链式调用,如下:

var fs = require('fs')
fs.createReadStream('input.txt')
.pipe(fs.createWriteStream('output.txt'))

url && querystring

url模块和querystring模块用来解析请求的url和GET和POST的参数

url用法:

var url = require('url')
url.parse(string)
====================================================
url.parse(string).query
|
url.parse(string).pathname |
| |
| |
------ -------------------
http://localhost:8888/start?foo=bar&hello=world

全局对象

名字 作用
__filename 当前正在执行的脚本的文件名
__dirname 当前执行脚本所在的目录
setTimeout(cb,ms) 在指定的毫秒(ms)数后执行指定函数(cb),只执行一次
clearTimeout(t) 停止一个之前通过 setTimeout() 创建的定时器
setInterval(cb,ms) 指定的毫秒(ms)数后执行指定函数(cb)。返回一个代表定时器的句柄值。不停调用函数
console 控制台标准输出,主要使用log方法

util

util 是一个Node.js 核心模块,提供常用函数的集合。

util.inspect(object): 输出object详细属性。

fs

Node.js提供文件操作API,通过引入fs模块使用。

读取文件:同步readFileSync()|异步readFile()

写入文件:fs.writeFile(file, data[, options], callback)

打开文件:fs.open()

【NodeJS】基础知识的更多相关文章

  1. 前端知识体系-NodeJS相关】NodeJS基础知识全面总结

    NodeJS基础知识 1. Node的全局对象和全局变量 1.1 全局对象:所有模块都可以调用的 global:表示Node所在的全局环境,类似于浏览器的window对象. process:该对象表示 ...

  2. nodejs基础知识查缺补漏

    1. 单线程.异步I/O.对比php nodejs是单线程的,但是是异步I/O,对于高并发时,它也能够快速的处理请求,100万个请求也可以承担,但是缺点是非常的耗内存,但是我们可以加大内存, 所以能用 ...

  3. Nodejs 基础知识 浅析

    1. 模块化 ①常用模块化规范 CommonJS + nodejs AMD(Asynchronous Module Definition) + RequireJS CMD(Common Module ...

  4. NodeJs 基础知识

    1.网站 http://nodejs.cn/ 下载最新NodeJs并且安装2. 你可以输入一个新命令“node”.使用该“node”命令有两种不同的方法.第一种不带任何参数,将打开一个交互式Shell ...

  5. 21.Nodejs基础知识(下)——2019年12月16日

    2019年10月04日16:56:23 7. 模块 7.1 暴露一个类,字段 var bar = require("./bar.js"); var msg = "你好&q ...

  6. 20.Nodejs基础知识(上)——2019年12月16日

    2019年12月16日18:58:55 2019年10月04日12:20:59 1. nodejs简介 Node.js是一个让JavaScript运行在服务器端的开发平台,它让JavaScript的触 ...

  7. NodeJS基础知识

    console.log方法: console.log("This is a test string"); node app.js 使用重定向标准输出流: node app.js 1 ...

  8. 1.nodejs权威指南--基础知识

    1. 基础知识 1.1 全局作用域及函数 1.1.1 全局作用域 在nodejs中,定义了一个global对象,代表nodejs中的全局命名空间,任何全局变量.函数或对象都是该对象的一个属性值 1.1 ...

  9. nodejs+gulp+webpack基础知识

    nodejs+gulp+webpack基础知识 2019年08月22日 11:49:40 天府云创 阅读数 22   版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文 ...

随机推荐

  1. Spring Boot入门(五):使用JDBC访问MySql数据库

    本系列博客记录自己学习Spring Boot的历程,如帮助到你,不胜荣幸,如有错误,欢迎指正! 在程序开发的过程中,操作数据库是必不可少的部分,前面几篇博客中,也一直未涉及到数据库的操作,本篇博客 就 ...

  2. .Net Core中利用TPL(任务并行库)构建Pipeline处理Dataflow

    在学习的过程中,看一些一线的技术文档很吃力,而且考虑到国内那些技术牛人英语都不差的,要向他们看齐,所以每天下班都在疯狂地背单词,博客有些日子没有更新了,见谅见谅 什么是TPL? Task Parall ...

  3. Thymeleaf【快速入门】

    前言:突然发现自己给自己埋了一个大坑,毕设好难..每一个小点拎出来都能当一个小题目(手动摆手..),没办法自己选的含着泪也要把坑填完..先一点一点把需要补充的知识学完吧.. Thymeleaf介绍 稍 ...

  4. Windows中使用Mysql-Proxy实现Mysql读写分离

    1.简介 读写分离:当业务量上来时,往往一台单机的mysql数据库不能满足性能需求,这时候就需要配置主从库读写分离来解决性能瓶颈.简单的来说,就是原先一台数据库既读又写,现在改成一台写和1台以上读. ...

  5. Cron表达式详解【转】

    Cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,每一个域代表一个含义,Cron有如下两种语法格式: Seconds Minutes Hours DayofMonth Month ...

  6. 读书笔记:深入理解java虚拟机(一)虚拟机的运行时的数据区域

    最近在看深入了解java虚拟机第一版(周志明著),特此写读书笔记,整理其中重要的东西和自己的理解. ”java与c++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却 ...

  7. RFID和QRCODE对比

    1.技术介绍 1.1 RFID 射频识别,RFID(Radio Frequency Identification)技术,又称无线射频识别,是一种通信技术,可通过无线电讯号识别特定目标并读写相关数据,而 ...

  8. 【Teradata SQL】一个字段为空即取另外一个字段(连续取4个字段)-case when

    目标:如果col1为空则取col2的值,如果col2也为空则取col3的值,如果col3还为则取col4的值,如果四个字段均为空则取默认值 1.数据准备 create multiset table t ...

  9. MongoDB 4.0 开发环境搭建集群

    环境准备 Liunx 服务器一台 以下示例为单机版安装集群, 没有分片 MongoDB 安装 1.下载 MongoDB tgz 安装包: 可以从下载中心下载: https://www.mongodb. ...

  10. 暖春许愿季丨i春秋给你送福利

    没有一点点防备 也没有一丝顾虑 就这样出现——暖春许愿季 纳尼?这不是我的歌声里 是i春秋在搞活动 这次准备搞个大的 多大呢 看这里 你许下心愿 我帮你实现 这是一棵神奇的心愿树 是一个畅所欲言之地 ...