服务端JavaScript

  众所周知的,JavaScript是运行在浏览器的脚本语言,JavaScript通常作为客户端程序设计语言使用,以JavaScript写出的程序常在用户的浏览器上运行。直至Nodejs的出现,Node.js大部分基本模块都用JavaScript语言编写,Node.js的出现使JavaScript也能用于服务器端编程。Node.js含有一系列内置模块,使得程序可以脱离Apache HTTP ServerIIS,作为独立服务器运行。

Node.js概况

  Node.js允许通过JavaScript和一系列模块来编写服务器端应用和网络相关的应用。

  核心模块包括文件系统I/O、网络(HTTP、TCP、UDP、DNS、TLS/SSL等)、二进制数据流、加密算法、数据流等等。

  运用Node.js的相关框架可以快速的完成应用的开发,常用的框架有Express.js、Koa.js、Socket.IO和Connect等。

  Node.js主要用于编写像Web服务器一样的网络应用,这和PHP和Python是类似的。但是Node.js与其他语言最大的不同之处在于,PHP等语言是阻塞的(只有前一条命令执行完毕才会执行后面的命令),而Node.js是非阻塞的(多条命令可以同时被运行,通过回调函数得知命令已结束运行)。

  Node.js是事件驱动的。开发者可以在不使用线程的情况下开发出一个能够承载高并发的服务器。

  Node.js使用Google V8JavaScript 引擎,因为V8是基于BSD许可证的开源软件且速度非常快并且专注于网络功能,在HTTP、DNS、TCP等方面更加成熟。

  Node.js的包管理器npm可完成相关依赖包的模块下载。

Node.js简单应用

  应用说明:通过启动本地服务器,完成图片上传并展示的功能。

  一、需要的模块

  HTTP服务器模块(HTTP服务器):http://nodejs.cn/api/http.html#http_http

  fs模块(文件系统):http://nodejs.cn/api/fs.html#fs_file_system

  url模块(网址):http://nodejs.cn/api/url.html#url_class_url

  formidable模块(处理文件上传,ps:该模块需要npm install安装):https://cnodejs.org/topic/4f16442ccae1f4aa2700104d

  二、思路分析

  1.启动服务器,发送HTTP请求

  2.通过获取请求参数,执行路由跳转或处理程序

  三、模块抽取及代码展示

  1.抽取出主页面index.js(解耦)

/**
* Created by aaron.
*/
var server=require('./server');
var router=require('./router');
var requestHandlers=require('./requestHandlers') var handle={}
handle['/']=requestHandlers.start,
handle['/start']=requestHandlers.start,
handle['/upload']=requestHandlers.upload,
handle['/show']=requestHandlers.show; server.start(router.route,handle);

  2.创建服务器并监听客户端请求事件server.js

/**
* Created by aaron.
*/
var http=require('http');
var url=require('url'); function start(route,handle) {
function onRequest(request,response) {
var postData='';
var pathname=url.parse(request.url).pathname;
console.log('Request for'+pathname+'received'); //node-formidable会对postData及setEncoding处理
/*request.setEncoding('utf8');
request.addListener('data',function (postDataChunk) {
postData+=postDataChunk;
console.log('Received POST data chunk'+postDataChunk+'.');
});
request.addListener('end',function () {
route(handle,pathname,response,postData);
})*/
route(handle,pathname,response,request); }
http.createServer(onRequest).listen(8888);
console.log('Server has started.');
} exports.start=start;

  3.获取请求参数并执行路由跳转router.js

/**
* Created by aaron.
*/
function route(handle,pathname,response,request) {
console.log('About to route a request for'+pathname);
if(typeof handle[pathname]==='function'){
handle[pathname](response,request);
}else{
console.log('No request handler found for'+pathname);
response.writeHead(404,{'Content-type':'text/plain'});
response.write('404 Not found');
response.end();
}
} exports.route=route;

  4.请求处理程序并作出响应requestHandler.js

/**
* Created by aaron.
*/
//执行非阻塞操作,从node来执行一个shell命令
var exec=require('child_process').exec;
var querystring=require('querystring');
var fs=require('fs');
var formidable=require('formidable'); function start(response) {
console.log('Request handler "start" was called.'); var body='<html>' +
'<head>' +
'<meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>' +
'</head>' +
'<body>' +
'<form action="/upload" method="post" enctype="multipart/form-data">' +
'<input type="file" name="upload"/>' +
'<br/>'+
'<input type="submit" value="Upload file"/>'+
'</form>' +
'</body>'+
'</html>'; response.writeHead(200,{'Content-type':'text/html'});
response.write(body);
response.end();
} function upload(response,request) {
console.log('Request handler "upload " was called.'); var form=new formidable.IncomingForm();
form.parse(request,function (error,fields,files) {
console.log('parsing done:<br/>'+files.upload.path);
fs.renameSync(files.upload.path,'C:/temp/test.jpg');
response.writeHead(200,{'Content-type':'text/html'});
response.write('received image:<br/>');
response.write('<img src="/show"/>');
response.end();
})
/*response.writeHead(200,{'Content-type':'text/plain'});
response.write('You`ve sent the text:'+
querystring.parse(postData).text
);
response.end();*/
} function show(response,postData) {
console.log('Request handler "show" was called.');
fs.readFile('C:/temp/test.jpg','binary',function (error,file) {
if(error){
response.writeHead(500,{'Content-type':'text/plain'});
response.write(error+'\n');
response.end();
}else{
response.writeHead(200,{'Content-type':'image/jpg'});
response.write(file,'binary');
response.end();
}
})
} exports.start=start;
exports.upload=upload;
exports.show=show;

  5.结果展示

  选择图片--> 上传 --> 展示图片

补充说明

  

  fs.renameSync()执行函数时如果执行图片上传的盘不是系统盘时会提示报错,解决方案是图片路径设置为绝对路径并设置为系统盘。

更多参考

  GitHub源码:https://github.com/PCAaron/node

  《Node.js入门》:https://www.nodebeginner.org/index-zh-cn.html

  维基百科:https://zh.wikipedia.org/wiki/Node.js

  Node.js中文网:http://nodejs.cn/api/

  

  

Nodejs入门-基于Node.js的简单应用的更多相关文章

  1. 基于node.js制作爬虫教程

    前言:最近想学习node.js,突然在网上看到基于node的爬虫制作教程,所以简单学习了一下,把这篇文章分享给同样初学node.js的朋友. 目标:爬取 http://tweixin.yueyishu ...

  2. 基于Node.js + WebSocket 的简易聊天室

    代码地址如下:http://www.demodashi.com/demo/13282.html Node.js聊天室运行说明 Node.js的本质就是运行在服务端的JavaScript.Node.js ...

  3. 基于 Node.js 的服务器自动化部署搭建实录

    基于 Node.js 的服务器自动化部署搭建实录 在服务器上安装 Node.js 编写拉取仓库.重启服务器脚本 配置 Github 仓库的 Webhook 设置 配置 Node.js 脚本 其他问题 ...

  4. 基于 Node.js 平台,快速、开放、极简的 web 开发框架。

    资料地址:http://www.expressjs.com.cn/ Express 基于 Node.js 平台,快速.开放.极简的 web 开发框架. $ npm install express -- ...

  5. Fenix – 基于 Node.js 的桌面静态 Web 服务器

    Fenix 是一个提供给开发人员使用的简单的桌面静态 Web 服务器,基于 Node.js 开发.您可以同时在上面运行任意数量的项目,特别适合前端开发人员使用. 您可以通过免费的 Node.js 控制 ...

  6. 基于Node.js + jade + Mongoose 模仿gokk.tv

    原文摘自我的前端博客,欢迎大家来访问 http://www.hacke2.cn 关于gokk 大学的娱乐活动基本就是在寝室看电影了→_→,一般都会选择去goxiazai.cc上看,里面的资源多,质量高 ...

  7. 基于node.js构建微服务中的mock服务

    缘起 由于现在微服务越来越火了,越来越多的微服务融入到了日常开发当中.在开发微服务的时候,经常会遇到一个问题由于依赖于其他服务,导致你的进度受到阻碍.使你不得不先mock出你期望调用依赖服务的输出,来 ...

  8. KoaHub平台基于Node.js开发的Koa 连接支付宝插件代码信息详情

    KoaHub平台基于Node.js开发的Koa 链接支付宝插件代码信息详情 easy-alipay alipay payment & notification APIs easy-alipay ...

  9. koa : Express出品的下一代基于Node.js的web框架

    https://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000/001434501579966a ...

随机推荐

  1. JAVA中String = null 与 String = "" 的区别

    JAVA中String = null 与 String = ""的区别 笔者今天在Debug的时候发现的NPE(NullPointerException),辛辛苦苦地调试了半天,终 ...

  2. 结对作业-基于GUI的四则运算

    一.需求分析 1.题目要求: 我们在个人作业1中,用各种语言实现了一个命令行的四则运算小程序.进一步,本次要求把这个程序做成GUI(可以是Windows PC 上的,也可以是Mac.Linux,web ...

  3. 201521123082《Java程序设计》第3周学习总结

    201521123082<Java程序设计>第3周学习总结 标签(空格分隔): Java 1.本周学习总结 XMind图: 2.书面作业 Q1.代码阅读 public class Test ...

  4. 201521044091 《Java程序设计》第5周学习总结

    1. 本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 1.2 可选:使用常规方法总结其他上课内容. ●接口可以定义行为,但却不能定义操作: ●使用abstract方法修饰可能变化的 ...

  5. 201521123114 《Java程序设计》第3周学习总结

    1. 本章学习总结 2. 书面作业 Q1.代码阅读 以上代码可否编译通过?哪里会出错?为什么?尝试改正? 如果创建3个Test1对象,有内存中有几个i,几个j?请分析原因? 不能编译通过,Test1g ...

  6. 201521123036 《Java程序设计》第11周学习总结

    本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 书面作业 本次PTA作业题集多线程 互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) 1.1 除了使用 ...

  7. 201521123071 《JAVA程序设计》第十四周学习总结

    第14周作业-数据库 1. 本周学习总结 1.1 以你喜欢的方式(思维导图.Onenote或其他)归纳总结多数据库相关内容. 1.使用JDBC将Java程序与数据库连接 1.1注册驱动 Class.f ...

  8. 下载安装ActiveMQ(消息队列)

    安装步骤: 第一步.安装jdk环境,因为ActiveMQ是使用java语言编写. 第二步.将下载好的activemq压缩包上传至Linux系统,进行解压. 第三步.进入解压后的bin/目录,进行启动a ...

  9. Spring第五篇【cglib、手动实现AOP编程】

    前言 到目前为止,已经简单学习了Spring的Core模块.也会怎么与Struts2框架进行整合了-.于是我们就开启了Spring的AOP模块了-在讲解AOP模块之前,首先我们来讲解一下cglib代理 ...

  10. 《Head First Java》读书笔记(1) - Java语言基础

    <Head First Java>(点击查看详情) 1.写在前面的话 这本书的知识点说实话感觉有点散乱,但是贵在其将文字转换成了生动和更容易接受的图片,大量的比喻让人感受到了知识点的有趣之 ...