Node.js 安装

1.下载http://nodejs.org/dist/v0.12.1/node-v0.12.1-x86.msi并完成安装

2.下载https://www.python.org/ftp/python/2.7.9/python-2.7.9.msi并完成安装

3.打开CMD,依次输入命令:node –v 及 python,查询node.js 与 python 版本号

Node.js IDE 安装

4.下载http://download-cf.jetbrains.com/webstorm/WebStorm-9.0.3.exe并完成安装



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



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包管理器(npm)

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

使用上面的命令可以方便地管理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命令。

实现代码,如下所示:

  1. #!/usr/bin/env node
  2. var process = require('process');
  3. var taskShell = require('task-shell');
  4. var events = require('events');
  5. var bash = '/bin/bash';
  6. // create event emitter
  7. var emitter = new events.EventEmitter();
  8. // register event: 'parseCommand'
  9. emitter.on('parseCommand', function(argv) {
  10. var shell = '';
  11. console.log('argv.length=' + argv.length);
  12. if(argv.length >= 2) {
  13. for(var i=2; i<argv.length; i++) {
  14. shell += ' ' + argv[i];
  15. console.log('shell=' + shell);
  16. }
  17. }
  18. console.log('Parsed shell cmd: ' + shell);
  19. // emit
  20. emitter.emit('executeCommand', shell);
  21. });
  22. //register event: 'executeCommand'
  23. emitter.on('executeCommand', function(shellCmd) {
  24. console.log('Execute shell cmd: ' + shellCmd);
  25. if(shellCmd != '') {
  26. shellCmd = bash + ' ' + shellCmd;
  27. var shell = new taskShell();
  28. shell.run([], {command : shellCmd}, console);
  29. console.log('Shell cmd executed.');
  30. }
  31. });
  32. console.log('Passed cmd line: ' + process.argv);
  33. emitter.emit('parseCommand', process.argv);

• 创建一个HTTP服务器

  1. #!/usr/bin/env node
  2. var port = 8080;
  3. var host = '192.168.1.115';
  4. console.log('Confiugre: host=' + host + ', port=' + port);
  5. var http = require('http');
  6. var server = http.createServer(function(req, res) {
  7. res.writeHead(200, {'Content-Type' : 'text/plain'});
  8. res.end('Welcome to our site!!!');
  9. });
  10. console.log('Server created: ' + server);
  11. server.listen(port, host);

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

  1. npm install http

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

  1. node debughttp.js

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

• 使用express框架创建HTTP服务器

  1. #!/usr/bin/env node
  2. var express = require('express');
  3. var app = express();
  4. app.use(function(req, res, next) {
  5. console.log('%s : %s', req.method, req.url);
  6. next();
  7. });
  8. app.use(function(req, res, next) {
  9. res.send(200, {'Response OK' : 'http://localhost:8080'});
  10. });
  11. app.listen(8080);

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

• 文件读写

  1. #!/usr/bin/env node
  2. var fs = require('fs');
  3. var file = '/etc/passwd';
  4. var encoding = 'UTF-8';
  5. fs.readFile(file, encoding, function(err, data) {
  6. if(err) {
  7. console.error(err);
  8. } else {
  9. console.log(data);
  10. }
  11. });

• 使用socket.io、socket.io-client、process、util模块

下面实现的脚本,是一个服务端和客户端简单会话的逻辑,脚本名称为endpoint.js,首先需要安装socket.io、socket.io-client、process这三个模块。

下面代码执行,可以通过从命令传递选项参数,选择启动服务器,还是连接到服务器,代码实现如下所示:

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

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

  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的代码实现:

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

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

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

参考链接

https://nodejs.org/

https://cnodejs.org/

http://nodeapi.ucdok.com/#/api/

Node.js学习入门手册的更多相关文章

  1. Node.js学习入门

    Node.js是什么 Node.js是一个可以允许我们在服务器端运行JavaScript代码的程序. 这是什么意思呢?通常,我们写的JavaScript代码都是在浏览器中运行的. 实际上,浏览器就是一 ...

  2. 【入门必备】最佳的 Node.js 学习教程和资料书籍

    Web 开发人员对 Node.js 的关注日益增多,更多的公司和开发者开始尝试使用 Node.js 来实现一些对实时性要求高,I/O密集型的业务.这篇文章中,我们整理了一批优秀的资源,你可以得到所有你 ...

  3. Node.js学习系列总索引

    Node.js学习系列也积累了一些了,建个总索引方便相互交流学习,后面会持续更新^_^! 尽量写些和实战相关的,不讲太多大道理... Node.js学习笔记系列总索引 Nodejs学习笔记(一)--- ...

  4. Node.js学习看这里:基础、进阶、文章

    Node.js是基于Chrome JavaScript运行时建立的一个平台,实际上它是对Google Chrome V8引擎进行了封装,它主要用于创建快速的.可扩展的网络应用. Node.js采用事件 ...

  5. 系列文章--Node.js学习笔记系列

    Node.js学习笔记系列总索引 Nodejs学习笔记(一)--- 简介及安装Node.js开发环境 Nodejs学习笔记(二)--- 事件模块 Nodejs学习笔记(三)--- 模块 Nodejs学 ...

  6. Node.js开发入门—使用AngularJS

    做一个Web应用,一般都有前台和后台,Node.js能够实现后台.利用jade模板引擎也能够生成一些简单的前台页面,但要想开发出具有实际意义的现代Web应用.还得搭配一个Web前端框架. Angula ...

  7. Node.js核心入门

    前言: 因为以前学习Node.js并没有真正意义上的去学习它,而是粗略的学习了npm的常用命令和Node.js一些模块化的语法,因此昨天花了一天的时间看了<Node.js开发指南>一书.通 ...

  8. NODE.JS学习的常见误区及四大名著

    NODE.JS学习的常见误区及四大名著 前段时间由于不满于社区里很多人对于NODE.JS的种种误解而写了一篇文章名为: NODE.JS之我见:http://www.cnblogs.com/pugang ...

  9. node.js学习(1)

    新建便笺 3 node.js学习(1) 1)安装 http://nodejs.org/download/下载. 2)编写一个案例 var http=require("http"); ...

随机推荐

  1. Vim插件YCM的安装

    YouCompleteMe(YCM)是一款非常好用的Vim插件,但是很多人安装的时候会出问题(尤其是涉及到C和C++的补全),我安装的时候也遇到了问题,现在解决了,给大家参考: Step1: 通过Vu ...

  2. 实现段落文字两端对齐的css样式

    有时候网站中的文字比较多,虽然为父元素设置了宽度,但是总是会出现两端参差不齐的情况,看起来不整齐.其实实现段落的两端对齐,只需要设置两个css 样式即可. .demo{ text-align: jus ...

  3. [CQOI2016][bzoj4519] 不同的最小割 [最小割树]

    题面 传送门 思路 首先我们明确一点:这道题不是让你把$n^2$个最小割跑一遍[废话] 但是最小割过程是必要的,因为最小割并没有别的效率更高的算法(Stoer-Wagner之类的?) 那我们就要尽量找 ...

  4. 关于jena-fuseki SPARQL query版本问题的解决方案

    在做“Apache jena SPARQL endpoint及推理”时,遇到了不少问题,主要原因是jena-fuseki版本更新了.以下对问题解决方案做下笔记.想了解更多,请查阅底部参考文献. Que ...

  5. bzoj4455【ZJOI2016】小星星

    题意:http://www.lydsy.com/JudgeOnline/problem.php?id=4455 给一张图和该图的一棵生成树,求可能的编号方案数 sol  :dalao教导我们,看到计数 ...

  6. Codeforces Round #241 (Div. 2) B dp

    B. Art Union time limit per test 1 second memory limit per test 256 megabytes input standard input o ...

  7. Java面试题之在多线程情况下,单例模式中懒汉和饿汉会有什么问题呢?

    懒汉模式和饿汉模式: public class Demo { //private static Single single = new Single();//饿汉模式 private static S ...

  8. git 以及 工作区 版本库 暂存区

    https://www.jianshu.com/p/a308acded2ce            这个博客介绍的比较简单 https://blog.csdn.net/qq_31828515/arti ...

  9. JavaScript (JS)基础:DOM 浅析 (含数组Array、字符串String基本方法解析)

    ①文本对象document: 例如:document.getElementById()    只获取一个对象          document.getElementsByTagName()   获取 ...

  10. HDOJ 1085 Holding Bin-Laden Captive!

    Holding Bin-Laden Captive! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Ja ...