如何测试nodejs部署到服务器器安装node js

Windows环境下NodeJS的安装和配置,解决找不到模块的问题
第一步:去官网下载NodeJS安装包
下载链接:&
第二步:安装
因为windows的管理员权限机制,所以这里不推荐安装在C盘,我在这里更改为了非系统盘。
第三步:检测安装成功
打开命令提示符,Git Bash或者刚刚安装好的Node.js command prompt
可以在程序目录里面找到
命令行界面
第四步:配置全局模块的存放路径
npm是NodeJS的模块管理,我们可以自己配置npm的全局模块的存放路径以及cache的路径,例如我希望将以上两个文件夹放在NodeJS的主目录下,便首先在NodeJs下建立&node global&及&node cache&两个文件夹。
接着在cmd中键入两行命令:
npm config set prefix &D:\nodejs\node global&
npm config set cache &D:\nodejs\node cache&
可以通过输入&npm config get prefix&来查看设置是否成功。
第五步:设置系统环境变量
打开系统环境变量对话框,如图所示:
由于改变了module的默认地址,所以用户变量都要跟着改变一下(用户变量&PATH修改为&刚才我们设置的全局模块存放路径&),要不使用module的时候会导致输入命令出现&&xxx不是内部或外部命令,也不是可运行的程序或批处理文件&这个错误&。
我使用的全局模块存放路径为&D:\nodejs\node global&(见上方设置的prefix&值),我将它添加到我的用户变量里面
同时在&系统变量&添加&NODE_PATH&变量,使用全局安装时,首先会在这个目录去寻找模块。
Paste_Image.png
第六步:测试安装模块Bower
在命令行输入&npm install bower -g&,稍等片刻后便会安装成功,再次在命令行输入&bower -v&,会出现正确的版本号,表示配置成功。
后续便可以轻松地使用npm管理工具来构建你自己的前端工作流了。
【声明】:黑吧安全网()登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱,我们会在最短的时间内进行处理。
上一篇:【】【】Node.js 教程
Node.js 创建第一个应用
如果我们使用PHP来编写后端的代码时,需要Apache 或者 Nginx 的HTTP 服务器,并配上 mod_php5 模块和php-cgi。
从这个角度看,整个"接收 HTTP 请求并提供 Web 页面"的需求根本不需 要 PHP 来处理。
不过对 Node.js 来说,概念完全不一样了。使用 Node.js 时,我们不仅仅 在实现一个应用,同时还实现了整个 HTTP 服务器。事实上,我们的 Web 应用以及对应的 Web 服务器基本上是一样的。
在我们创建 Node.js 第一个 "Hello, World!" 应用前,让我们先了解下 Node.js 应用是由哪几部分组成的:
引入 required 模块:我们可以使用 require 指令来载入 Node.js 模块。
创建服务器:服务器可以监听客户端的请求,类似于 Apache 、Nginx 等 HTTP 服务器。
接收请求与响应请求 服务器很容易创建,客户端可以使用浏览器或终端发送 HTTP 请求,服务器接收请求后返回响应数据。
创建 Node.js 应用
步骤一、引入 required 模块
我们使用 require 指令来载入 http 模块,并将实例化的 HTTP 赋值给变量 http,实例如下:
var http = require("http");
步骤一、创建服务器
接下来我们使用 http.createServer() 方法创建服务器,并使用 listen 方法绑定 8888 端口。
函数通过 request, response 参数来接收和响应数据。
实例如下,在你项目的根目录下创建一个叫 server.js 的文件,并写入以下代码:
var http = require('http');
http.createServer(function (request, response) {
// 发送 HTTP 头部
// HTTP 状态值: 200 : OK
// 内容类型: text/plain
response.writeHead(200, {'Content-Type': 'text/plain'});
// 发送响应数据 "Hello World"
response.end('Hello World\n');
}).listen(8888);
// 终端打印如下信息
console.log('Server running at http://127.0.0.1:8888/');
以上代码我们完成了一个可以工作的 HTTP 服务器。
使用 node 命令执行以上的代码:
node server.js
Server running at http://127.0.0.1:8888/
接下来,打开浏览器访问 http://127.0.0.1:8888/,你会看到一个写着
"Hello World"的网页。
分析Node.js 的 HTTP 服务器:
第一行请求(require)Node.js 自带的
模块,并且把它赋值给
接下来我们调用 http 模块提供的函数:
createServer
。这个函数会返回
一个对象,这个对象有一个叫做
的方法,这个方法有一个数值参数,
指定这个 HTTP 服务器监听的端口号。
Gif 实例演示
接下来我们通过 Gif 图为大家演示实例操作:后使用快捷导航没有帐号?
Node.js项目实战:从编写代码到服务器部署
查看: 16132|
评论: 0|原作者: 岸岸
快速报名:
本课程以实现一个基本功能完整的论坛系统入手,以实现业务逻辑为主,力求展现编写Node.js项目的整个流程。同时在实现过程中也会介绍各种常用模块的 基本使用方法,比如express、supertest、mocha、passport、mysql、pm2、async、webpack等。
完成论坛系统基本功能之外,课程还会加入以下内容:
通过Git来管理项目源码
第三方账号登录
API服务(允许第三方使用论坛数据,或通过该接口开发新功能)
Gulp前端自动化构建
搭建私有NPM库
服务器环境配置
发布NPM模块
对于初学者而言,最重要的是如何从一个最简单的系统开始,随着业务需求的变化不断重构你的代码。通过本课程的学习,你将学习到从编写项目的第一行代码到在服务器上部署项目的整个过程。
课程大纲:
第1课:开发环境配置
代码编辑器、Git源码管理工具、数据库GUI客户端
Node.js版本管理工具
第2课:创建项目
创建项目,编写基础代码
express、配置文件管理、数据库连接、Bootstrap
第3课:实现用户功能
用户注册、登录
基于Passport.js实现第三方账号登录
第4课:实现论坛基本功能
发帖、帖子列表、帖子编辑
堠匀匀处理、代码高亮、排版样式
第5课:完善论坛功能(1)
消息通知(站内消息与邮件通知)
第6课:完善论坛功能(2)
用户权限:普通用户、版主、管理员
反爬虫和反垃圾广告
第7课:项目优化
重新组织代码数据缓存
webpack自动构建、合并资源文件
第8课:API服务(1)
传Auth认证
请求签名算法
编写签名验证工具
第9课:API服务(2)
实现论坛数据API服务功能
编写API客户端模块
第10课:单元测试
后端测试:mocha与supertest
第11课:服务器配置
利用cnpmjs搭建私有NPM库
利用GitLab搭建私有Git库
持续集成与自动测试服务器
第12课:部署到服务器
安装VisualBox虚拟机、CentOS 7
配置服务器软件:Nginx、MySQL、SSH
在服务器部署项目、自启动配置
第13课:发布到NPM上
将模板与代码分离,打包成模块并发布到NPM
基于此论坛系统模块快速搭建一个新的论坛
授课时间:
课程预计日开课,预计课程持续时间为15周。
授课对象:
刚开始使用Node.js的开发人员,希望更深入了解Node.js,希望使用Node.js开发项目的学员。
课程必备:
需要有一定的JavaScript或Node.js开发基础
收获预期:
通过本课程的学习,你将学习到从编写项目的第一行Node.js代码到在服务器上部署项目的整个过程。
讲师简介:
雷宗民,《Node.js实战》作者之一,SuperID.me后端工程师,三年Node.js开发经验,GitHub主页:课程试听:
新颖的课程收费形式:“逆向收费”约等于免费学习,仅收取100元固定收费+300元暂存学费,学习圆满则全额奖励返还给学员!
本门课程本来打算完全免费,某位大神曾经说过“成功就是正确的方向再加上适度的压力”。考虑到讲师本身要付出巨大的劳动,为了防止一些朋友在学习途中半途而废,浪费了讲师的付出,为此我们计划模仿某些健身课程,使用“逆向收费”的方法。
在报名时每位报名者收取400元,其中100元为固定 收费,另外300是暂存学费,即如果学员能完成全部课程要求,包括完成全部的书面和互动作业,则300元全款退回,优秀的学员还可以获得礼品 奖励。如果学员未能坚持到完全所有的学习计划任务,则会被扣款。期望这种方式可以转化为大家强烈的学习愿望和驱动力!
课程授课方式:
1、 学习方式:老师发布教学资料、教材,幻灯片和视频,学员通过网络下载学习。同时通过论坛互动中老师对学员进行指导及学员之间相互交流。
2、 学习作业:老师每周布置书面及互动作业,学员需按时按质完成作业。
3、 老师辅导:根据作业批改中发现的问题,针对性给予辅导,帮助大家掌握知识。
4、 结业测验:通过测验,完成学业。
您是否对此课程还有疑问,那么请 ,您的问题将基本得到解答全国统一咨询热线
课程现开始接受报名,报名方式
网上报名 请点击:咨询Email :,
课程入门讨论咨询群:(群内有培训公开课视频供大家免费观看) 咨询QQ:
(上班时间在线)
最新技术热点、 最新行业资讯,最新培训课程信息,尽在炼数成金官方微信,低成本传递高端知识!技术成就梦想!欢迎关注!
打开微信,使用扫一扫功能,即刻关注炼数成金官方微信账户,不容错过的精彩,期待您的体验!!!
快速报名:
刚表态过的朋友 ()
上一篇:下一篇:HTML5开发(22)
如何大家之前做过web服务器的人都知道,nginx+lua与现在流行的node.js都是可以做web服务器的,前者在程序的写法和配置上要比后者麻烦,但用起来都是差不多.在这里建议大家如果对lua脚本语言不了解,可以多了解这门脚本语言,他号称是所有脚本语言执行效率是最高的一门脚本语言.底层是基于C语言的,非常好用,跨平台!
下面我就来给大家配置一下node.js环境.
二 mac node.js环境的配置
第一步:打开终端,输入以下命令安装Homebrew
ruby -e “$(curl -fsSL
第二步:安装node,在终端输入以下命令
brew install node
第三步 查看node安装成功与否
以上三步 node就安装成功了
三 程序测试
第一步:新建一个文件test.js
第二步:用终端找到其所在的目录运行
第三步:通过浏览器进行访问,返回json格式的数据
第四步:前端就可以通过调用这个接口进行数据解析了,并且可以在当前页面进行数据展示了.
是不是很简单,如果之前做过web服务接口开发的,这个应该不会陌生,甚至来说非常简单了.
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:159632次
积分:3053
积分:3053
排名:第7927名
原创:137篇
转载:31篇
译文:12篇
评论:38条
阅读:2194
阅读:2071
阅读:14023
阅读:10903
阅读:15697
阅读:9004
阅读:6336
阅读:4784
阅读:3421
(5)(17)(16)(38)(10)(35)(7)(19)(26)IBM Bluemix
点击按钮,开始云上的开发!
developerWorks 社区
node.js 是一个可以使用 JavaScript 开发服务器端应用的平台。它依托于 Google V8 JavaScript 引擎,并采用事件 I/O 的架构,可以用来创建高性能服务器。本文详细介绍了 node.js 的基本知识、模块化的结构、事件驱动的机制以及常用的模块。
, 高级软件工程师, IBM
成富任职于 IBM 中国软件开发中心,目前在 Lotus 部门从事 IBM Mashup Center 的开发工作。他毕业于北京大学信息科学技术学院,获得计算机软件与理论专业硕士学位。他的个人网站是 。
随着 Web 2.0 概念和 Ajax 技术的流行,JavaScript 作为 Ajax 应用开发中必不可少的一部分,已经得到了广泛的流行。开发人员也开始逐步的熟悉和掌握 JavaScript,并积累了相关的开发经验。虽然 JavaScript 目前主要用在 Web 应用中,以浏览器作为运行平台,但是已经有相关的尝试把 JavaScript 迁移到服务器端,这其中包括 Aptana 的
等。这种做法与
是异曲同工的。Google GWT 允许开发人员使用 Java 语言来编写 Web 前端代码。这两种做法的目的都是为了复用开发人员已经掌握的知识和积累的经验。在这点上,node.js 类似于 Jaxer。简单的来说,node.js 是一个允许开发人员使用 JavaScript 语言编写服务器端代码的框架。也就是说编写的 JavaScript 代码可以直接运行在本地机器上,而不仅限于浏览器。从实现的角度来说,Jaxer 和 node.js 都使用了已有的 JavaScript 执行引擎。Jaxer 用的是 Mozilla Firefox 中使用的 JavaScript 引擎,而 node.js 用的则是 Google Chrome 中用的 V8 引擎。node.js 入门node.js 可以运行在 Linux、Windows 和 Macintosh 等主流的操作系统上。在 Windows 平台上运行 node.js 的话,需要 Cygwin 或是 MinGW 的支持。下面以常用的 Windows 平台为例来说明。首先需要安装 Cygwin。安装的时候需要选择 gcc-g++ 、make 、openssl 和 python 等包。gcc 的版本必须是最新的。接着从
中给出的地址下载 node.js 0.4.0 版本的源代码。下载解压之后,依次在 Cygwin 中运行 ./configure 、make 和 make install 等命令进行编译和安装。安装完成之后,直接运行 node 命令就可以启动 node.js 提供的命令行。在命令行中可以直接输入 JavaScript 代码并运行。也可以通过 node server.js 的方式来运行一个 JavaScript 文件 server.js 。 中给出了一个简单的“Hello World”程序的示例。通过 node helloworld.js 来运行该 JavaScript 文件之后,会在控制台输出“Hello World”。清单 1. 使用 node.js 的“Hello World”程序 process.stdout.write("Hello World"); 中的 process 表示的是当前运行的 node.js 进程,其属性 stdout 表示的是进程的标准输出流。通过 write() 方法向给流中写入一个字符串。从
可以看到,使用 JavaScript 就可以访问标准输出流等本地系统上的资源。这从一个侧面反映出来了 node.js 的强大。在 node.js 可以运行的 JavaScript 代码中,可以使用一些全局的对象:包括
中用到的 process 、下面会介绍的用来加载模块的 require() 方法、表示当前正在执行的 JavaScript 文件名的 __filename 、表示当前正在执行的 JavaScript 文件的目录的 __dirname 和与浏览器中相似的用来执行定时任务的 setTimeout() 和 setInterval() 方法等。在介绍了 node.js 的基本知识之后,下面介绍 node.js 的模块化结构。模块化结构node.js 使用了
定义的模块系统。不同的功能组件被划分成不同的模块。应用可以根据自己的需要来选择使用合适的模块。每个模块都会暴露一些公共的方法或属性。模块使用者直接使用这些方法或属性即可,不需要关系模块内部的实现细节。除了系统预置的多个模块之外,应用开发团队也可以利用这个机制来将应用拆分成多个模块,以提高代码的可复用性。使用模块在 node.js 中使用一个模块的方式是非常简单的。使用某个模块之前需要首先声明对它的依赖。在 JavaScript 代码中可以直接使用全局函数 require() 来加载一个模块。如 require("http") 可以加载系统预置的 http 模块。而 require("./myModule.js") 用来加载与当前 JavaScript 文件同一目录下的 myModule.js 模块。如果使用 require() 的路径以“/”开头的话,则认为是模块 JavaScript 文件在操作系统上的绝对路径。如果不是这两种情况的话,node.js 就会尝试在当前 JavaScript 文件的父目录及其祖先目录下的 node_modules 目录下查找。比如目录 /usr/home/my.js 中调用了 require("other.js") 的话,node.js 会依次尝试查找下列文件:/usr/home/node_modules/other.js 、/usr/node_modules/other.js 和 /node_modules/other.js 。require() 方法的返回值是该模块所暴露出来的公开 JavaScript 对象,包含了可供使用的方法和属性。 给出了模块的基本使用方式。清单 2. 模块的基本使用方式 var greetings = require("./greetings.js");
var msg = greetings.sayHello("Alex", "zh_CN");
process.stdout.write(msg);如
所示,一般是直接把 require() 方法的返回值赋值给一个变量,在 JavaScript 代码中直接使用此变量即可。greetings.js 模块暴露了一个 sayHello() 方法,当前 JavaScript 代码直接使用了该方法。开发自己的模块开发自己的模块的基本工作是在模块对应的 JavaScript 文件中编写模块相关的代码。这其中封装了模块的内部处理逻辑。一般来说,一个模块通常会暴露一些公开的方法或属性给其使用者。模块的内部代码需要把这些方法或属性给暴露出来。 给出了
中所使用的 greetings.js 文件的内容。清单 3. greetings.js 模块的内容 var languages = {
"zh_CN" : "你好,",
"en" : "Hello, "
exports.sayHello = function(name, language) {
return languages[language] || languages["en"] +
所示,exports 对象的内容就是模块的使用者调用 require() 方法的返回值中所包含的内容。模块通过这种方式来声明其所暴露出来的公开方法和属性。在模块中定义的变量,如 languages ,是只对模块内部的代码可见的。如果一个模块所包含的内容比较多,也可以用文件夹的方式来组织。可以在文件夹的根目录下面创建一个 package.json 文件,其内容中包含了模块的名称和入口 JavaScript 文件的路径。如果没有提供这个 package.json 文件的话,node.js 会默认在文件夹中查找 index.js 文件作为模块的启动 JavaScript 文件。在介绍完 node.js 的模块化结构之后,下面介绍其事件驱动机制。事件驱动开发过 Web 应用的人都熟悉浏览器中的事件处理机制。当对某个 DOM 元素上的某类事件感兴趣的时候,只需要在该 DOM 元素上面注册一个事件监听器即可。如 ele.addEventListener("click", function() {}) 就添加了一个对 click 事件的监听器。当事件发生的时候,事件监听器的 JavaScript 方法就会被调用。事件的处理方法是异步执行的。这种异步执行的方式非常适合于开发高性能并发网络应用。实际上,目前的高性能并发应用开发一般有两种做法:第一种是使用多线程的机制,另外一种就是采用基于事件驱动的方式。多线程的问题在于应用开发起来难度较高,很容易出现线程饥饿或是死锁等问题,对开发人员提出了更高的要求。而事件驱动的方式则更加灵活,很容易为 Web 开发人员所理解和使用,也不存在线程死锁等问题。依托于性能强大的 Google V8 引擎和先进的事件 I/O 架构,node.js 可以成为创建高性能服务器端应用的良好基础。基于 node.js 开发应用与开发 Web 应用有相似的编程模型。很多模块都会暴露出一些事件,使用这些模块的代码通过注册事件监听器的方式来添加相应的处理逻辑。 中给出了一个简单的 HTTP 代理服务器的实现代码。清单 4. HTTP 代理服务器 var http = require("http");
var url = require("url");
http.createServer(function (req, res) {
var urlObj = url.parse(req.url, true); // 获取被代理的 URL
var urlToProxy = urlObj.query.
if (!urlToProxy) {
res.statusCode = 400;
res.end("URL 是必须的。");
console.log("处理代理请求:" + urlToProxy);
var parsedUrl = url.parse(urlToProxy);
var opt = {
host : parsedUrl.hostname,
port : parsedUrl.port || 80,
path : (parsedUrl.pathname || "") + (parsedUrl.search || "")
+ (parsedUrl.hash || "")
http.get(opt, function(pres) { // 请求被代理 URL 的内容
res.statusCode = pres.statusC
var headers = pres.
for (var key in headers) {
res.setHeader(key, headers[key]);
pres.on("data", function(chunk) {
res.write(chunk); // 写回数据
pres.on("end", function() {
res.end();
}).listen(8088, "127.0.0.1");
console.log("代理服务器已经在 8088 端口启动。");整个代理服务器的实现比较简单。首先通过 http 模块中的 createServer() 方法用来创建一个 HTTP 服务器,再通过 listen() 方法就可以让该 HTTP 服务器在特定端口监听。在 createServer() 方法中传入的参数是 HTTP 请求的响应方法。实际上,每个 HTTP 请求都是对应于 HTTP 服务器上的一个 request 事件。 中的 HTTP 服务器创建部分实际上等价于
中给出的实现方式。清单 5. 使用事件机制的 HTTP 服务器创建方式 var server = http.createServer();
server.on("request", function(req, res) {
});在请求的处理方法里面,通过 http.get() 方法来获取被代理 URL 的内容。这里同样采用了基于事件的处理方式。pres.on("data", function(chunk) {}) 在 pres 的 data 事件上添加了一个处理方法。该方法的作用是当获取到被代理 URL 的内容的时候,就把获取到的内容写回到原始 HTTP 请求的响应中。对于 end 事件的处理也是同样的。在使用 node.js 进行开发的时候,会经常遇到这种使用事件处理方法和回调方法的场景。在介绍了 node.js 的事件驱动机制之后,下面介绍一些常用的模块。常用模块node.js 默认提供了很多与网络与文件系统操作相关的模块。这些模块是构建服务器端应用的基础。下面对其中一些常见的模块进行具体说明。事件模块前面提到过,node.js 采用的是事件驱动的架构,其中的很多模块都会产生各种不同的事件,可以由模块使用者来添加事件处理方法。所有能够产生事件的对象都是事件模块中的 EventEmitter 类的实例。EventEmitter 类中的方法都与事件的产生和处理相关,如下所示:addListener(event, listener) 和 on(event, listener) :这两个方法的作用都是用来为某个事件 event 添加事件处理方法 listener 。once(event, listener) :这个方法为某个事件 event 添加仅执行一次的处理方法 listener 。处理方法在执行一次之后就会被删除。removeListener(event, listener) :该方法用来删除某个事件 event 上的处理方法 listener 。emit(event, [arg1], [arg2], [...]) :该方法用来产生某个事件 event 。事件名称 event 之后的参数被传递给对应的事件处理方法。 给出了事件模块的使用示例。清单 6. 事件模块的使用示例 var events = require("events");
var emitter = new events.EventEmitter();
emitter.on("myEvent", function(msg) {
console.log(msg);
emitter.emit("myEvent", "Hello World.");在事件模块中有一个特殊的事件 error 。当出现错误的时候,EventEmitter 会产生此事件。如果此事件没有对应的处理方法的话,默认的行为是输出错误信息后,程序自动终止。因此,需要注意总是添加一个对 error 事件的处理方法。流node.js 中存在各式各样不同的数据流,包括文件系统、HTTP 请求和响应、以及 TCP/UDP 连接等。这些流都是 EventEmitter 的实例,因此可以产生各种不同的事件。流可以分成只读、只写和读写流三种。可读流主要会产生 4 个事件:data :当读取到流中的数据时,产生此事件。end :当流中没有数据可读时,产生此事件。error :当读取数据出现错误时,产生此事件。close :当流被关闭时,产生此事件。除了上面的事件之外,还有一个 pipe() 方法可以用来把当前的可读流和另外一个可写流连接起来。可读流中的数据会被自动写入到可写流中。可写流中最常用的是 write() 和 end() 两个方法。write() 方法用来向流中写入数据,而 end() 则用来结束写入操作。为了表示二进制数据,node.js 使用了类 Buffer 来表示数据缓冲区,以对二进制数据进行操作。Buffer 类内部是以数组的方式来存储数据的。一旦创建出来之后,Buffer 的大小是不能被修改的。Buffer 类的实例是可以与 JavaScript 中的字符串类型互相转换的。在转换的时候需要指定编码格式。通过 Buffer 类的 toString(encoding, start, end) 方法可以把 Buffer 中的从 start 到 end 的内容转换成以 encoding 编码的字符串。可以支持的编码格式有:ascii 、utf8 和 base64 。通过 new Buffer(str, encoding) 可以用一个字符串 str 来初始化一个缓冲区。write(string, offset, encoding) 用来把一个字符串 string 以编码格式 encoding 写入到缓冲区中以 offset 开始的位置上。网络操作node.js 提供了一些与网络操作相关的模块,包括 TCP、UDP 和 HTTP 等,可以实现网络服务器和客户端。与 TCP 协议相关的实现在 net 模块中。通过该模块的 createServer(connectionListener) 方法可以创建一个 TCP 服务器。参数 connectionListener 是当有客户端连接到该服务器上时的处理方法,等价于对 connect 事件的处理。一个 TCP 服务器是类 Server 的实例。通过 listen 方法可以让服务器在指定端口监听。如果想连接到一个已有的 TCP 服务器的话,可以使用 createConnection(port, host) 方法来连接到指定主机 host 的端口 port 上。该方法的返回值是 Socket 类的实例,表示一个套接字连接。得到一个 Socket 类的实例之后,就可以通过 write() 方法来向该连接中写入数据。如果想从该连接上获取数据的话,可以添加 data 事件的处理方法。 中给出了一个简单的用来进行表达式计算的 TCP 服务器,可以通过 telnet 命令连接到此服务器来进行测试。清单 7. 简单的表达式计算服务器 var net = require("net");
var server = net.createServer(function(socket) {
socket.setEncoding("utf8");
var buffer = [], len = 0;
socket.on("data", function(data) { // 接收到客户端数据
if (data.charCodeAt(0) == 13) {
var expr = buffer.join("");
var result = eval(expr); // 进行计算
socket.write(result.toString()); // 写回结果
} catch (e) {
socket.write("Wrong expression.");
} finally {
socket.write("\r\n");
buffer = [];
buffer.push(data);
server.listen(8180, "127.0.0.1");
console.log("服务器已经在端口 8180 启动。");除了 TCP 服务器外,模块 http 和 https 可以分别实现 HTTP 和 HTTPS 服务器,模块 dgram 可以实现 UDP/Datagram 套接字连接,模块 tls 可以实现安全的套接字连接(SSL)。这些模块的使用方式都类似于模块 tcp 。文件系统node.js 中的 fs 模块用来对本地文件系统进行操作。fs 模块中提供的方法可以用来执行基本的文件操作,包括读、写、重命名、创建和删除目录以及获取文件元数据等。每个操作文件的方法都有同步和异步两个版本。异步操作的版本都会使用一个回调方法作为最后一个参数。当操作完成的时候,该回调方法会被调用。而回调方法的第一个参数总是保留为操作时可能出现的异常。如果操作正确成功,则第一个参数的值是 null 或 undefined 。而同步操作的版本的方法名称则是在对应的异步方法之后加上一个 Sync 作为后缀。比如异步的 rename() 方法的同步版本是 renameSync() 。下面列出来了 fs 模块中的一些常用方法,都只介绍异步操作的版本。rename(path1, path2) :将路径 path1 表示的目录或文件重命名成路径 path2 。truncate(fd, len) :将文件描述符 fd 对应的文件的长度截断为 len 。chmod(path, mode) :将路径 path 表示的目录或文件的权限修改为 mode 。stat(path) :获取路径 path 表示的目录或文件的元数据。元数据用 Stats 类来表示。open(path, flags, mode) :打开一个路径 path 表示的文件。回调方法中可以得到该文件的描述符。read(fd, buffer, offset, length, position) :读取给定文件描述符 fd 所表示的文件中从 position 位置开始的长度为 length 字节的数据,并存放到缓冲区 buffer 中从 offset 起始的位置上。回调方法中可以得到实际读取的字节数。write(fd, buffer, offset, length, position) :将缓冲区 buffer 中的数据写入到文件描述符 fd 所表示的文件中。参数的含义与 read() 方法一样。回调方法中可以得到实际写入的字节数。readFile(filename, encoding) :以编码格式 encoding 来读取一个文件 filename 中的内容。回调方法中可以得到文件的内容。writeFile(filename, data, encoding) :将数据 data 以编码格式 encoding 写入到文件 filename 中。除了上面列出来的直接操作文件本身的方法外,还可以把文件转换成流。createReadStream(path, options) 和 createWriteStream(path, options) 分别用来从文件中创建可读和可写流。参数 path 表示的是文件的路径,options 是一个表示读取或写入文件时的选项的 JavaScript 对象。 中给出了一个简单的 HTTP 静态文件服务器的实现。清单 8. HTTP 静态文件服务器 var http = require("http"),
fs = require("fs"),
path = require("path"),
url = require("url");
var server = http.createServer(function(req, res) {
var pathname = url.parse(req.url).
var filepath = path.join("/tmp", "wwwroot", pathname);
var stream = fs.createReadStream(filepath, {flags : "r", encoding : null});
stream.on("error", function() {
res.writeHead(404);
res.end();
stream.pipe(res);
server.on("error", function(error) {
console.log(error);
server.listen(8088, "127.0.0.1");如
所示,首先把 HTTP 请求的路径转换成服务器上文件路径,再从文件中创建可读流,最后通过 pipe() 方法把文件的数据流传递到 HTTP 请求的响应中。辅助模块除了上面介绍的这些常见模块之外,node.js 还提供了一些辅助的模块。模块 path 用来处理文件系统上的路径。这个模块中的 join() 用来把多个路径连接起来,形成一个完整的路径。如 join("/usr", "home", "test/index.html") 的结果是路径 /usr/home/test/index.html 。normalize() 用来对路径进行归一化操作,去掉其中多余的“/”以及处理“..”和“.”。resolve([from ...], to) 方法用来获取给定路径 to 的绝对路径。如果 to 不是绝对路径,就把它之前的参数按从右到左的顺序添加上去,直到得到了一个绝对路径。如果到最后还是无法得到绝对路径,就把当前的工作目录加上。假设当前的工作目录是 /usr/home ,那么 resolve("test", "index.html") 的返回结果是 /usr/home/test/index.html 。dirname() 方法用来获取路径的目录部分。如 dirname("/usr/home/index.html") 的返回结果是 /usr/home 。basename() 用来获取路径的最后一个部分。如 basename("/usr/home/index.html") 的返回结果是 index.html 。extname() 用来获取一个路径的文件扩展名部分。如 extname("/usr/home/index.html") 的返回结果是 .html 。模块 url 用来对 URL 进行解析。parse(urlStr, parseQueryString) 方法用来把一个 URL 字符串 urlStr 解析成主机名、端口和路径等几个部分。该方法的返回值是一个包含了 protocol 、hostname 、port 、pathname 和 query 等属性的 JavaScript 对象。如果参数 parseQueryString 的值为 true 的话,URL 中包含的查询字符串部分也会被解析。format(urlObj) 方法的作用与 parse() 方法正好相反,用来从一个 JavaScript 对象中构建出 URL 字符串。模块 querystring 用来处理 URL 中的查询字符串。stringify(obj) 方法用来把一个 JavaScript 对象 obj 转换成查询字符串的格式。如 stringify({a : 1, b : "good"}) 的返回结果是 a=1&b=good 。parse(str) 用来把一个查询字符串解析成 JavaScript 对象。模块 vm 可以用来执行 JavaScript 代码。方法 runInThisContext(code) 用来执行一段 JavaScript 代码 code 并返回其结果。通过该方法运行的 JavaScript 代码不能访问当前代码的作用域。runInNewContext(code, [sandbox]) 方法也是用来执行 JavaScript 代码的,与 runInThisContext() 不同的是通过该方法运行的 JavaScript 代码使用 sandbox 对象作为全局对象。如 runInNewContext("a + 3", {a : 4}) 的返回结果是 7。createScript(code) 方法用来预先编译一段 JavaScript 代码,但是并不立即执行。该方法的返回值是一个 Script 对象。该对象同样有 runInThisContext() 和 runInNewContext([sandbox]) 两个方法,含义与上面提到的两个方法类似。模块 os 提供了与底层操作系统相关的一些信息。包括 hostname() 用来获取操作系统的主机名;type() 用来获取操作系统的类型;release() 用来获取操作系统的发行版本号;uptime() 用来获取以秒计算的系统运行时间;cpus() 用来获取 CPU 的相关信息。freemem() 和 totalmem() 分别用来获取系统的内存总数和可用内存数。模块 util 提供了一些常用的辅助方法。debug(string) 方法用来输出信息到标准错误流。log(string) 方法用来输出附带时间戳的信息到标准输出流。inspect(object, showHidden, depth) 方法用来输出一个对象的内部结构,参数 object 是要查看的对象,showHidden 表示是否查看对象的隐藏属性,depth 表示查看的对象层次结构的深度,默认值是 2。inherits(constructor, superConstructor) 方法用来实现 JavaScript 中基于原型的继承机制。在介绍完 node.js 提供的常用模块之后,下面通过一个完整的示例来说明 node.js 的用法。实例分析这个实例实现的功能是动态监测服务器的内存使用状态,即内存的占用率。获取服务器上的内存占用率比较简单,只需要使用 os 模块提供的方法即可,即 freemem()/totalmem() 。为了能够实时的监测内存占有率,服务器需要实时的把数据传输给浏览器端。这里最好的实现方式是 HTML 5 中引入的 WebSocket 规范。该规范在 Firefox 4 和 Google Chrome 等新浏览器上得到了支持。同时服务器端也需要支持此规范。Socket.IO 在 node.js 上提供了对 WebSocket 规范的支持,包括服务器端和浏览器端代码。 给出了使用 Socket.IO 的服务器端代码。清单 9. 监测内存占用率的服务器端代码 var io = require('./socket.io');
var io = io.listen(server);
io.on("connection", function(client){
setInterval(function() {
client.send(os.freemem() / os.totalmem());
中,server 是 node.js 中的一个 HTTP 服务器对象,用来响应一般的 HTTP 请求。Socket.IO 可以对 node.js 的 HTTP 服务器的请求进行拦截,将部分请求交给 Socket.IO 来处理。这里的处理逻辑是当有客户端连接上的时候,就每隔 500 毫秒把服务器的内存占用率发送给客户端。 给出了浏览器端的 HTML 和 JavaScript 代码。清单 10. 监测内存占用率的浏览器端代码 &!doctype html&
&title& 服务器内存使用情况 &/title&
&script src="/socket.io/socket.io.js"&&/script&
#usage {border : 1}
var canvas, width = 200, height = 200, buffer = [], max = 200;
function updateChart(data) {
if (buffer.length &= max) {
buffer.unshift();
buffer.push(data);
var ctx = canvas.getContext("2d");
ctx.clearRect(0, 0, width, height);
for (var i = 1, n = buffer. i & i++) {
ctx.strokeStyle = "red";
ctx.beginPath();
ctx.moveTo(i - 1 , buffer[i - 1] * height);
ctx.lineTo(i, buffer[i] * height);
ctx.closePath();
ctx.stroke();
function onLoad() {
canvas = document.getElementById("usage");
var socket = new io.Socket(null, {port: 8088});
socket.connect(); // 连接到服务器
socket.on("message", function(obj){ // 接收到消息时的处理方法
updateChart(obj);
&body onload="onLoad();"&
&h1& 内存使用情况 &/h1&
&canvas id="usage" width="200" height="200"&&/canvas&
所示,首先建立一个与服务器之间的 WebSocket 连接。通过 message 事件定义了当接收到服务器端的消息时,更新浏览器端的显示。浏览器端通过一个 HTML 5 提供的 canvas 来绘制内存占用率的曲线图,如
所示。图 1. 内存占用率的曲线图总结一提到服务器端开发,开发人员一般想到的就是 Java 和 C/C++ 等语言。但是通过 node.js 提供的强大能力,熟悉 JavaScript 的 Web 开发人员也可以开发出服务器端的应用。本文详细介绍了 node.js 的事件驱动机制和模块化结构,并对其中的常用模块做了详细说明,最后通过一个完整的实例展示了 node.js 的实用性。
下载描述名字大小本文中用到的 node.js 上开发的 JavaScript 代码4KB
参考资料 查看
的官方说明文档。
“ ”给出了 WebSocket 规范。查看
的说明文档。 :通过专门关于 Web 技术的文章和教程,扩展您在网站开发方面的技能。 :这是有关 Ajax 编程模型信息的一站式中心,包括很多文档、教程、论坛、blog、wiki 和新闻。任何 Ajax 的新信息都能在这里找到。 ,这是有关 Web 2.0 相关信息的一站式中心,包括大量 Web 2.0 技术文章、教程、下载和相关技术资源。您还可以通过
栏目,迅速了解 Web 2.0 的相关概念。查看
,了解更多和 HTML5 相关的知识和动向。下载
的最新信息。加入
。查看开发人员推动的博客、论坛、组和维基,并与其他 developerWorks 用户交流。
developerWorks: 登录
标有星(*)号的字段是必填字段。
保持登录。
单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件。
在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。
所有提交的信息确保安全。
选择您的昵称
当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。昵称长度在 3 至 31 个字符之间。
您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。
标有星(*)号的字段是必填字段。
(昵称长度在 3 至 31 个字符之间)
单击提交则表示您同意developerWorks 的条款和条件。 .
所有提交的信息确保安全。
文章、教程、演示,帮助您构建、部署和管理云应用。
立即加入来自 IBM 的专业 IT 社交网络。
为灾难恢复构建应用,赢取现金大奖。
static.content.url=/developerworks/js/artrating/SITE_ID=10Zone=Web developmentArticleID=741913ArticleTitle=使用 node.js 进行服务器端 JavaScript 编程publish-date=

我要回帖

更多关于 nodejs部署到服务器 的文章

 

随机推荐