node开发指南

摘要:
什么节点。js可以做的事情就像JavaScript是为客户端和节点而生的一样。js是为网络而生的。节点。Js内置了HTTP服务器支持,这意味着您可以轻松实现网站和服务器的组合。节点。Js还可以部署到非网络应用程序环境,例如命令行工具。其原理是事件对象将事件注册到某个_事件侦听器。然后,我们在1000毫秒后通过setTimeout_event将一些事件发送到事件对象,一些事件将被调用为事件的Listener。同时,原型中定义的属性不会作为控制台输出的对象属性。日志

Node.js 能做什么

正如 JavaScript 为客户端而生,Node.js 为网络而生。Node.js 能做的远不止开发一个网站那么简单,使用 Node.js,你可以轻松地开发:

  • 具有复杂逻辑的网站;
  • 基于社交网络的大规模 Web 应用;
  • Web Socket 服务器;
  • TCP/UDP 套接字应用程序;
  • 命令行工具;
  • 交互式终端程序;
  • 带有图形用户界面的本地应用程序;
  • 单元测试工具;
  • 客户端 JavaScript 编译器。

Node.js 内建了 HTTP 服务器支持,也就是说你可以轻而易举地实现一个网站和服务器的组合。这和 PHP、Perl 不一样,因为在使用 PHP 的时候,必须先搭建一个 Apache 之类的 HTTP 服务器,然后通过 HTTP 服务器的模块加载或 CGI 调用,才能将 PHP 脚本的执行结果呈现给用户。而当你使用 Node.js 时,不用额外搭建一个 HTTP 服务器,因为 Node.js 本身就内建了一个。这个服务器不仅可以用来调试代码,而且它本身就可以部署到产品环境,它的性能足以满足要求。
Node.js 还可以部署到非网络应用的环境下,比如一个命令行工具。Node.js 还可以调用 C/C++ 的代码,这样可以充分利用已有的诸多函数库,也可以将对性能要求非常高的部分用 C/C++ 来实现。

创建一个 HTTP 服务器

//app.js 
 
var http = require('http'); 
 
http.createServer(function(req, res) { 
  res.writeHead(200, {'Content-Type': 'text/html'}); 
  res.write('<h1>Node.js</h1>'); 
  res.end('<p>Hello World</p>'); 
}).listen(3000); 
console.log("HTTP server is listening at port 3000.");

EventEmitter 的用法:

//event.js 
 
var EventEmitter = require('events').EventEmitter; 
var event = new EventEmitter(); 
 
event.on('some_event', function() { 
  console.log('some_event occured.'); 
}); 
 
setTimeout(function() { 
  event.emit('some_event'); 
}, 1000); 

运行这段代码,1秒后控制台输出了 some_event occured.。其原理是 event 对象注册了事件 some_event 的一个监听器,然后我们通过 setTimeout 在1000毫秒以后向 event 对象发送事件 some_event,此时会调用 some_event 的监听器。

Node.js调试工具

node-inspector

util.inherits 的用法,示例如下:

var util = require('util'); 
 
function Base() { 
  this.name = 'base'; 
  this.base = 1991; 
   
  this.sayHello = function() { 
    console.log('Hello ' + this.name); 
  }; 
} 
 
Base.prototype.showName = function() { 
  console.log(this.name); 
 
}; 
 
function Sub() { 
  this.name = 'sub'; 
} 
 
util.inherits(Sub, Base); 
 
var objBase = new Base(); 
objBase.showName(); 
objBase.sayHello(); 
console.log(objBase); 
 
var objSub = new Sub(); 
objSub.showName(); 
//objSub.sayHello(); 
console.log(objSub); 

我们定义了一个基础对象 Base 和一个继承自 Base 的 Sub,Base 有三个在构造函数内定义的属性和一个原型中定义的函数,通过 util.inherits 实现继承。运行结果如下:

base 
Hello base 
{ name: 'base', base: 1991, sayHello: [Function] } 
sub 
{ name: 'sub' } 

注意,Sub 仅仅继承了 Base 在原型中定义的函数,而构造函数内部创造的 base 属性和 sayHello 函数都没有被 Sub 继承。同时,在原型中定义的属性不会被 console.log 作为对象的属性输出。如果我们去掉 objSub.sayHello(); 这行的注释,将会看到:

node.js:201 
        throw e; // process.nextTick error, or 'error' event on first tick 
              ^ TypeError: Object #<Sub> has no method 'sayHello' 
    at Object.<anonymous> (/home/byvoid/utilinherits.js:29:8) 
    at Module._compile (module.js:441:26) 
    at Object..js (module.js:459:10) 
    at Module.load (module.js:348:31) 
    at Function._load (module.js:308:12) 
    at Array.0 (module.js:479:10) 
    at EventEmitter._tickCallback (node.js:192:40) 

fs 模块函数表

打开文件
fs.open(path,flags, [mode], [callback(err, fd)])
fs.openSync(path, flags, [mode])
**关闭文件 **
fs.close(fd, [callback(err)])
fs.closeSync(fd)
读取文件 (文件描述符)
fs.read(fd,buffer,offset,length,position, [callback(err, bytesRead, buffer)])
fs.readSync(fd, buffer, offset, length, position)
写入文件 (文件描述符)
fs.write(fd,buffer,offset,length,position, [callback(err, bytesWritten, buffer)])
fs.writeSync(fd, buffer, offset, length, position)
**读取文件内容 **
fs.readFile(filename,[encoding],[callback(err, data)])
fs.readFileSync(filename, [encoding])
**写入文件内容 **
fs.writeFile(filename, data,[encoding], [callback(err)])
fs.writeFileSync(filename, data, [encoding])
删除文件
fs.unlink(path, [callback(err)])
fs.unlinkSync(path)
**创建目录 **
fs.mkdir(path, [mode], [callback(err)])
fs.mkdirSync(path, [mode])
删除目录
fs.rmdir(path, [callback(err)])
fs.rmdirSync(path)
**读取目录 **
fs.readdir(path, [callback(err, files)])
fs.readdirSync(path)
**获取真实路径 **
fs.realpath(path, [callback(err, resolvedPath)])
fs.realpathSync(path)
**更名 **
fs.rename(path1, path2, [callback(err)])
fs.renameSync(path1, path2)
**截断 **
fs.truncate(fd, len, [callback(err)])
fs.truncateSync(fd, len)
**更改所有权 **
fs.chown(path, uid, gid, [callback(err)])
fs.chownSync(path, uid, gid)
**更改所有权 (文件描述符) **
fs.fchown(fd, uid, gid, [callback(err)])
fs.fchownSync(fd, uid, gid)
更改所有权 (不解析符号链接)
fs.lchown(path, uid, gid, [callback(err)])
fs.lchownSync(path, uid, gid)
**更改权限 **
fs.chmod(path, mode, [callback(err)])
fs.chmodSync(path, mode)
更改权限 (文件描述符)
fs.fchmod(fd, mode, [callback(err)])
fs.fchmodSync(fd, mode)
更改权限 (不解析符号链接)
fs.lchmod(path, mode, [callback(err)])
fs.lchmodSync(path, mode)
获取文件信息
fs.stat(path, [callback(err, stats)])
fs.statSync(path)
**获取文件信息 (文件描述符) **
fs.fstat(fd, [callback(err, stats)])
fs.fstatSync(fd)
获取文件信息 (不解析符号链接)
fs.lstat(path, [callback(err, stats)])
fs.lstatSync(path)
**创建硬链接 **
fs.link(srcpath, dstpath, [callback(err)])
fs.linkSync(srcpath, dstpath)
**创建符号链接 **
fs.symlink(linkdata, path, [type], [callback(err)])
fs.symlinkSync(linkdata, path, [type])
读取链接
fs.readlink(path, [callback(err, linkString)])
fs.readlinkSync(path)
修改文件时间戳
fs.utimes(path, atime, mtime, [callback (err)])
fs.utimesSync(path, atime, mtime)
修改文件时间戳(文件描述符)
fs.futimes(fd, atime, mtime, [callback (err)])
fs.futimesSync(fd, atime, mtime)
**同步磁盘缓存 **
fs.fsync(fd, [callback(err)])
fs.fsyncSync(fd)


获取 GET 请求内容

//httpserverrequestget.js 
 
var http = require('http'); 
var url = require('url'); 
var util = require('util'); 
 
http.createServer(function(req, res) { 
  res.writeHead(200, {'Content-Type': 'text/plain'}); 
  res.end(util.inspect(url.parse(req.url, true))); 
}).listen(3000); 

在浏览器中访问 http://127.0.0.1:3000/username=byvoid&email=byvoid@byvoid.com,我们可以看到浏览器返回的结果:

{ search: '?name=byvoid&email=byvoid@byvoid.com', 
  query: { name: 'byvoid', email: 'byvoid@byvoid.com' }, 
  pathname: '/user',
  path: '/user?name=byvoid&email=byvoid@byvoid.com', 
  href: '/user?name=byvoid&email=byvoid@byvoid.com' } 

通过 url.parse原始的 path 被解析为一个对象,其中 query 就是我们所谓的 GET 请求的内容,而路径则是 pathname。

获取 POST 请求内容

//httpserverrequestpost.js 
 
var http = require('http'); 
var querystring = require('querystring'); 
var util = require('util'); 
 
http.createServer(function(req, res) { 
  var post = ''; 
 
  req.on('data', function(chunk) { 
    post += chunk; 
  }); 
 
  req.on('end', function() { 
    post = querystring.parse(post); 
    res.end(util.inspect(post)); 
  }); 
 
}).listen(3000); 

上面代码并没有在请求响应函数中向客户端返回信息,而是定义了一个 post 变量,用于在闭包中暂存请求体的信息。 通过 req 的 data 事件监听函数, 每当接受到请求体的数据,就累加到 post 变量中。在 end 事件触发后,通过 querystring.parse 将 post 解析为真正的 POST 请求格式,然后向客户端返回。

使用 Node.js进行 Web 开发

1.安装 Express

npm install -g express 

2.建立工程

express -t ejs microblog 

cd microblog && npm install

免责声明:文章转载自《node开发指南》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇操作select控件大全(新增、修改、删除、选中、清空、判断存在等)黑盒之测试用例设计策略下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

macOS 系统更新node老是不成功

 使用网上的方法,更新macOS系统上的node,总是不成功。   每次打开新的终端,node -v 都会显示之前的版本v8.11.4。。咋回事!!!     【方法】:    直接卸载 node(要卸载干净!)         但是通过 终端的命令行也难以卸载干净:MacOS X 10.10卸载Node      试了这个方法也不行:mac安装nod...

OSG开源教程(转)

整理:荣明、王伟 北 京 2008年4月 序 第一次接触OSG是在2001年,当时开源社区刚刚兴起,还没有现在这么火。下载了OSG源码,但是在看了几个Demo之后,感觉没有什么特别之处。时隔七年之后,我再次将目光投向OSG,发现OSG确实有其独到之处,很多3D效果已经不弱于甚至超过商业软件,有感于开源力量的巨大。但是,与当前主流3D商业软件如Vega、Ve...

[转帖]ArcGIS标注 [VBScript] Joe

ArcGIS标注 [VBScript] 分数形式标注要素: 首先将分母和分子的内容分别放在两个字段中,然后在标注的时候,标注内容选择用表达式标注,在表达式的输入框中输入"<UND>" & [分子的字段] & "</UND>" & vbNewLine & [分母的字段],即可实现分数形式的标注。...

阿里 otter搭建部署

IP:10.10.6.172 部署:mysql目标库,mysql源数据库 IP:10.10.6.173 部署:zookeeper,manager,node,canal (也都部署到源库服务器上) 由于otter进行数据库同步,目前仅支持row,所以需要把源库的binlog_format改为ROW log-bin=mysql-bin expire_logs_...

在Kubernetes中部署GlusterFS+Heketi

目录 简介 Gluster-Kubernetes 部署 环境准备 下载相关文件 部署glusterfs 部署heketi server端 配置heketi client 简介 在上一篇《独立部署GlusterFS+Heketi实现Kubernetes共享存储》中,我们说明了如何手动部署GlusterFS+Heketi来提供Kubernetes...

Netty5 HTTP协议栈浅析与实践

一、说在前面的话 前段时间,工作上需要做一个针对视频质量的统计分析系统,各端(PC端、移动端和 WEB端)将视频质量数据放在一个 HTTP 请求中上报到服务器,服务器对数据进行解析、分拣后从不同的维度做实时和离线分析。(ps:这种活儿本该由统计部门去做的,但由于各种原因落在了我头上,具体原因略过不讲……) 先用个“概念图”来描绘下整个系统的...