Node.js入门学习笔记

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介:

关于Node.js介绍,我们引用官网(http://nodejs.org/)的一段文字说明:

1 Node.js is a platform built on Chrome's JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices.

Google Chrome浏览器基于V8的,它是一个开源的JavaScript引擎,能够编译和执行JavaScript代码,在执行速度上有很大的优势。使用Node.js能够很容易地构建快速、可扩展的网络应程序,它使用了事件驱动、非阻塞I/O模型实现,具有轻量、高效的特点,适合于构建运行在分布地设备之上的数据密集型实时应用程序。
下面通过参考各种资料,从各个方面,概括地总结一下Node.js,是我们对Node.js有一个直观的了解:

  • 使用JavaScript运行于服务端的平台上,自然继承了JavaScript语言的一些特性;
  • Node.js基于单线程、基于非阻塞I/O模型实现;
  • 适合于数据密集型应用,不适用于计算密集型类的应用(如算法等);
  • 通过使用回调函数,来避免同步地等待I/O操作完成;
  • Node.js非核心模块非常多,质量可能参差不齐(使用别人贡献的模块,要有承担风险的准备);
  • 因为简单,开发Node.js应用程序效率很高;
  • 调试相对困难,调试工具可能没有其他一些比较成熟的语言(如Java、C++等)的好用;
  • Node.js基于事件驱动架构,events模块是Node.js最核心的模块。

我学习Node.js使用的工具及其环境配置,如下表所示:

工具/环境 版本 功能
Node.js 0.10.28 Node.js平台
CentOS 6.4 操作系统环境
npm 1.4.9 Node包管理器(Node Package Manager)
Python 2.6.6 Node.js依赖环境(Linux系统下)
Eclipse Kepler Service Release 2 Node.js调试工具

安装配置

安装步骤,如下所示:

1 cd /usr/local
2 sudo wget http://nodejs.org/dist/v0.10.28/node-v0.10.28-linux-x64.tar.gz
3 sudo tar xvzf node-v0.10.28-linux-x64.tar.gz
4 sudo ln -s /usr/local/node-v0.10.28-linux-x64 /usr/local/node
5 sudo chown -R shirdrn:shirdrn /usr/local/node*

配置内容:

1 vi ~/.bashrc
2 export PATH=$PATH:/usr/local/node/bin
3 . ~/.bashrc

Node包管理器(npm)

和Python等语言一样,在Node.js中可以使用npm来管理package,常用的命令,如下所示:

命令语法 说明 示例
npm -l 显示npm命令的用法信息 npm -l
npm install <pkg> 安装包(package) npm install express
npm install <pkg@version> 安装指定版本的包 npm install express@4.4.3
npm ls 显示已经安装的包 npm ls
npm uninstall <pkg> 卸载已经安装的包 npm uninstall express
npm update [pkg] 更新包 npm update或npm update express
npm version 查看npm版本号 npm version或npm -v
npm list 当前目录下已安装的包 npm list
npm list -g 当前系统下已经安装的包 npm list -g
npm view <pkg> 查看某个包的信息 npm view express
npm view <pkg> version 查看某个包的版本号 npm view express version
npm view <pkg> dependencies 查看某个包的依赖 npm view express dependencies
npm outdated 查看安装哪些包有新版本发布 npm outdated
npm publish <tarball> 发布包 npm publish mynodejs.tar
npm unpublish <project>[@<version>] 取消发布包 npm unpublish mynodejs@1.0.2
npm init 初始化包(产生package.json) npm init
npm tag <project>@<version> [<tag>] 打tag npm tag mynodejs@1.1.0 stable

使用上面的命令可以方便地管理Node.js包。

node工具

使用node工具运行Node.js脚本非常容易,语法格式如下所示:

1 node [options] [ -e script | script.js ] [arguments]

有三种执行方式:

  • 运行脚本

比如,运行脚本debug.js,执行如下命令即可:

1 node debug.js
  • 运行代码

如果,想要直接在命令执行代码段,可以使用-e选项,例如:

1 node -e 'console.log("hello")';

其中-e选项后面是一个代码的字符串,他会转换成JavaScript代码在Node.js运行时环境执行,类似eval函数,将执行字符串中的代码。

  • REPL模式运行

可以直接根据输入node命令,然后回车,根据前导提示符,输入命令执行,一般用来测试比较直观。

调试Node.js代码

可以使用Eclipse开发工具,安装Chrome Developer插件:
http://chromedevtools.googlecode.com/svn/update/dev/
这个是在线安装地址。
例如,我们在Eclipse中新建一个debug.js文件,代码如下所示:

1 // say hello example
2 var customer = 'shirdrn';
3 var f = function(name) {
4 console.log('Hello, ' + name + '!');
5 }
6 f(customer);

然后,在Shell终端启动调试:

1 node --debug-brk=9222 /home/shirdrn/nodejs/debug.js

接着,可以在Eclipse中对debug.js的代码设置断点,执行Debug As => Debug Configurations => 选择Standalone V8 VM,创建一个调试配置,然后可以调试运行,在断点处查看变量的值。

编程实践

  • 使用核心模块events

events模块是Node.js最核心的模块,通过使用该模块,可以了解Node.js的事件机制。下面代码是注册2个事件:一个是解析命令行传入参数的parseCommand事件,另一个是执行Shell命令的executeCommand事件。当脚本启动执行时,发射一个parseCommand事件,把命令行传递的参数传递给该事件函数,解析参数构造Linux下Shell命令行完成后,会发射一个executeCommand事件,去执行这个Shell命令。
实现代码,如下所示:

01 #!/usr/bin/env node
02
03 var process = require('process');
04 var taskShell = require('task-shell');
05 var events = require('events');
06 var bash = '/bin/bash';
07
08 // create event emitter
09 var emitter = new events.EventEmitter();
10 // register event: 'parseCommand'
11 emitter.on('parseCommand', function(argv) {
12 var shell = '';
13 console.log('argv.length=' + argv.length);
14 if(argv.length >= 2) {
15 for(var i=2; i<argv.length; i++) {
16 shell += ' ' + argv[i];
17 console.log('shell=' + shell);
18 }
19 }
20 console.log('Parsed shell cmd: ' + shell);
21 // emit
22 emitter.emit('executeCommand', shell);
23 });
24
25 //register event: 'executeCommand'
26 emitter.on('executeCommand', function(shellCmd) {
27 console.log('Execute shell cmd: ' + shellCmd);
28 if(shellCmd != '') {
29 shellCmd = bash + ' ' + shellCmd;
30 var shell = new taskShell();
31 shell.run([], {command : shellCmd}, console);
32 console.log('Shell cmd executed.');
33 }
34 });
35
36 console.log('Passed cmd line: ' + process.argv);
37 emitter.emit('parseCommand', process.argv);
  • 创建一个HTTP服务器
01 #!/usr/bin/env node
02
03 var port = 8080;
04 var host = '192.168.1.115';
05 console.log('Confiugre: host=' + host + ', port=' + port);
06
07 var http = require('http');
08 var server = http.createServer(function(req, res) {
09 res.writeHead(200, {'Content-Type' : 'text/plain'});
10 res.end('Welcome to our site!!!');
11 });
12 console.log('Server created: ' + server);
13
14 server.listen(port, host);

在运行前,首先要安装http模块:

1 npm install http

然后运行脚本(debughttp.js):

1 node debughttp.js

访问http://192.168.1.115:8080/,可以看到响应的消息内容。

  • 使用express框架创建HTTP服务器
01 #!/usr/bin/env node
02
03 var express = require('express');
04 var app = express();
05 app.use(function(req, res, next) {
06 console.log('%s : %s', req.method, req.url);
07 next();
08 });
09
10 app.use(function(req, res, next) {
11 res.send(200, {'hit' : 'www.shiyanjun.cn'});
12 });
13
14 app.listen(8080);

运行脚本,访问http://192.168.1.115:8080/,可以看到响应的JSON格式数据内容。扩展一下,你可以写一个HTML表单,通过表单提交数据到上面的地址,然后在代码中通过req来接收参数数据,然后进行处理,最后响应请求。

  • 文件读写
01 #!/usr/bin/env node
02
03 var fs = require('fs');
04 var file = '/etc/passwd';
05 var encoding = 'UTF-8';
06 fs.readFile(file, encoding, function(err, data) {
07 if(err) {
08 console.error(err);
09 } else {
10 console.log(data);
11 }
12 });
  • 使用socket.io、socket.io-client、process、util模块

下面实现的脚本,是一个服务端和客户端简单会话的逻辑,脚本名称为endpoint.js,首先需要安装socket.io、socket.io-client、process这三个模块。
下面代码执行,可以通过从命令传递选项参数,选择启动服务器,还是连接到服务器,代码实现如下所示:

01 #!/usr/bin/env node
02
03 var port = 8080;
04 var host = '192.168.1.115';
05 var util = require('util');
06
07 var startServer = function() {
08 var http = require('http');
09 var server = http.Server();
10 var io = require('socket.io')(server);
11 io.on('connection', function(socket) {
12 console.log('Connected!');
13 // emit version infomation
14 socket.emit('welcome', {'version' : '3.5.2', 'token' :'32jfds456FDSOwewA219bMqx4lPsz2'});
15 socket.on('report', function(data) {
16 console.log('Reported data: ' + util.inspect(data));
17 // do something
18 console.log('Computed!');
19 });
20 socket.on('close', function() {
21 console.log('Closed!');
22 });
23 });
24
25 console.log('Start server.');
26 server.listen(port, host);
27 };
28
29 var startClient = function() {
30 var client = require('socket.io-client');
31 var socket = client('http://' + host + ":" + port);
32 socket.on('welcome', function(data){
33 console.log('Get welcome info from server: ' + util.inspect(data));
34 var version = data['version'];
35 var token = data['token'];
36 console.log('version=' + version + ', token=' + token);
37 // do something
38 var reportData = {'alive' : ['node-01', 'node-06', 'node-03'], 'dead' : ['node-8']};
39 console.log('Report data: ' + util.inspect(reportData));
40 socket.emit('report', reportData);
41 socket.emit('close');
42 });
43 };
44
45 var process = require('process');
46 var argv = process.argv;
47 console.log('Passed arguments: ' + argv);
48
49 var option = argv[2];
50 if('server' == option) {
51 startServer();
52 } else if('client' == option) {
53 startClient();
54 } else {
55 console.error('Unknown augment: ' + option + '!');
56 }

启动服务器,执行如下命令行:

1 node endpoint.js server

启动连接服务器,执行如下命令行:

1 node endpoint.js client
  • 使用mysql模块连接MySQL数据库

首先要安装mysql、dateformat(格式化日期)模块:

1 npm install mysql
2 npm install dateformat

下面是使用Node.js操作MySQL的代码实现:

01 #!/usr/bin/env node
02
03 var mysql = require('mysql');
04 var util = require('util');
05 var dateFormat = require('dateformat');
06
07 var config = {
08 'host' : '192.168.1.105',
09 'port' : '3306',
10 'user' : 'shirdrn',
11 'password' : 'shiyanjun'
12 };
13
14 var connect = function() {
15 var connection = mysql.createConnection(config);
16 if(connection) {
17 console.log('Succeed to connected: ' + util.inspect(connection));
18 } else {
19 throw new Error('Fail to connect MySQL database!');
20 }
21 return connection;
22 }
23
24 var query = function(sql, callback) {
25 // connect to MySQL
26 try {
27 var connection = connect();
28 } catch(err) {
29 console.error(util.inspect(err));
30 throw err;
31 }
32 // execute SQL queries
33 connection.query(sql, callback);
34 connection.end();
35 console.log('Connection closed!');
36 }
37
38 // query example
39 var querySQL = 'SELECT id, host, port, updated_at FROM domain_db.traffic_proxy LIMIT 0,10';
40
41 query(querySQL, function(err, rows, fields) {
42 if(err) {
43 throw err;
44 }
45 for(var i=0; i<rows.length; i++) {
46 var row = rows[i];
47 var host = row['host'];
48 var port = row['port'];
49 var updatedAt = dateFormat(row['updated_at'], 'yyyy-MM-dd hh:mm:ss');
50 console.log('Record: host=' + host + ', port=' + port + ', updatedAt=' + updatedAt);
51 }
52 });

上面代码,从MySQL数据库中的一个表中查询数据,然后打印出来。

想进一步深入理解Node.js,可以参考相关文档,主要包括Node.js提供的一些特性,如继承(还有JavaScript具有的一些特性)。Node.js还有很多的模块,通过学习来开发自己Node.js应用程序。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
1月前
|
前端开发 机器人 API
前端大模型入门(一):用 js+langchain 构建基于 LLM 的应用
本文介绍了大语言模型(LLM)的HTTP API流式调用机制及其在前端的实现方法。通过流式调用,服务器可以逐步发送生成的文本内容,前端则实时处理并展示这些数据块,从而提升用户体验和实时性。文章详细讲解了如何使用`fetch`发起流式请求、处理响应流数据、逐步更新界面、处理中断和错误,以及优化用户交互。流式调用特别适用于聊天机器人、搜索建议等应用场景,能够显著减少用户的等待时间,增强交互性。
322 2
|
18天前
|
机器学习/深度学习 自然语言处理 前端开发
前端神经网络入门:Brain.js - 详细介绍和对比不同的实现 - CNN、RNN、DNN、FFNN -无需准备环境打开浏览器即可测试运行-支持WebGPU加速
本文介绍了如何使用 JavaScript 神经网络库 **Brain.js** 实现不同类型的神经网络,包括前馈神经网络(FFNN)、深度神经网络(DNN)和循环神经网络(RNN)。通过简单的示例和代码,帮助前端开发者快速入门并理解神经网络的基本概念。文章还对比了各类神经网络的特点和适用场景,并简要介绍了卷积神经网络(CNN)的替代方案。
|
18天前
|
移动开发 前端开发 JavaScript
前端实训,刚入门,我用原生技术(H5、C3、JS、JQ)手写【网易游戏】页面特效
于辰在大学期间带领团队参考网易游戏官网的部分游戏页面,开发了一系列前端实训作品。项目包括首页、2021校园招聘页面和明日之后游戏页面,涉及多种特效实现,如动态图片切换和人物聚合效果。作品源码已上传至CSDN,视频效果可在CSDN预览。
29 0
前端实训,刚入门,我用原生技术(H5、C3、JS、JQ)手写【网易游戏】页面特效
|
27天前
|
监控 前端开发 JavaScript
React 静态网站生成工具 Next.js 入门指南
【10月更文挑战第20天】Next.js 是一个基于 React 的服务器端渲染框架,由 Vercel 开发。本文从基础概念出发,逐步探讨 Next.js 的常见问题、易错点及解决方法,并通过具体代码示例进行说明,帮助开发者快速构建高性能的 Web 应用。
67 10
|
24天前
|
数据采集 存储 JavaScript
如何使用Puppeteer和Node.js爬取大学招生数据:入门指南
本文介绍了如何使用Puppeteer和Node.js爬取大学招生数据,并通过代理IP提升爬取的稳定性和效率。Puppeteer作为一个强大的Node.js库,能够模拟真实浏览器访问,支持JavaScript渲染,适合复杂的爬取任务。文章详细讲解了安装Puppeteer、配置代理IP、实现爬虫代码的步骤,并提供了代码示例。此外,还给出了注意事项和优化建议,帮助读者高效地抓取和分析招生数据。
如何使用Puppeteer和Node.js爬取大学招生数据:入门指南
|
2月前
|
JavaScript 前端开发 小程序
一小时入门Vue.js前端开发
本文是作者关于Vue.js前端开发的快速入门教程,包括结果展示、参考链接、注意事项以及常见问题的解决方法。文章提供了Vue.js的基础使用介绍,如何安装和使用cnpm,以及如何解决命令行中遇到的一些常见问题。
一小时入门Vue.js前端开发
|
1月前
|
存储 JavaScript 前端开发
前端开发:Vue.js入门与实战
【10月更文挑战第9天】前端开发:Vue.js入门与实战
|
1月前
|
自然语言处理 JavaScript 前端开发
JavaScript高级——ES6基础入门
JavaScript高级——ES6基础入门
25 1
|
1月前
|
机器学习/深度学习 自然语言处理 前端开发
前端大模型入门:Transformer.js 和 Xenova-引领浏览器端的机器学习变革
除了调用API接口使用Transformer技术,你是否想过在浏览器中运行大模型?Xenova团队推出的Transformer.js,基于JavaScript,让开发者能在浏览器中本地加载和执行预训练模型,无需依赖服务器。该库利用WebAssembly和WebGPU技术,大幅提升性能,尤其适合隐私保护、离线应用和低延迟交互场景。无论是NLP任务还是实时文本生成,Transformer.js都提供了强大支持,成为构建浏览器AI应用的核心工具。
478 1
|
2月前
|
JavaScript 前端开发 API
Vue学习笔记3:对比纯JavaScript和Vue实现数据更新的实时视图显示
Vue学习笔记3:对比纯JavaScript和Vue实现数据更新的实时视图显示
下一篇
无影云桌面