服务端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. 团队作业8 ----第二次项目冲刺(Beta阶段)博客汇总

    一.冲刺计划安排 团队作业8--Beta版本冲刺计划及安排 二.七天冲刺汇总 [Beta]第一次Daily Scrum Meeting [Beta]第二次Daily Scrum Meeting [Be ...

  2. 201521123093 java 第七周学习总结

    1. 本周学习总结 2. 书面作业 1.ArrayList代码分析 1.1 解释ArrayList的contains源代码 //contains()方法 public boolean contains ...

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

    1. 本章学习总结 2. 书面作业 Q1. clone方法 1.1 Object对象中的clone方法是被protected修饰,在自定义的类中覆盖clone方法时需要注意什么? 答:在同一个包里或者 ...

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

    1. 本章学习总结 2. 书面作业 Q1.代码阅读 public class Test1 { private int i = 1;//这行不能修改 private static int j = 2; ...

  5. list,set,map总结

    学习了集合,脑子里list,set,map之间的关系有混乱,在这里整理一下.有兴趣的朋友可以看下. 先看下 list,set,map各自的特点

  6. 201521123111《Java程序设计》第10周学习总结

    1. 本章学习总结 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容 线程不是程序 线程必须在程序对应的进程中运行 一个进程中可以同时执行多个线程,这些线程可以完成不同的功能. 2. 书面 ...

  7. 201521123036 《Java程序设计》第13周学习总结

    本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 书面作业 网络基础 1.1 比较ping www.baidu.com与ping cec.jmu.edu.cn,分 ...

  8. jvm系列:Java GC 分析

    Java GC就是JVM记录仪,书画了JVM各个分区的表演. 什么是 Java GC Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之 ...

  9. 02-windows 安装以太坊 ethereum 客户端 (win7-64)-大叔思维

    以太坊(Ethereum)是一个运行智能合约的去中心化平台(Platform for Smart Contract),平台上的应用按程序设定运行,不存在停机.审查.欺诈.第三方人为干预的可能.以太坊平 ...

  10. FastDFS安装全过程记录(V5.05)

    FastDFS安装全过程记录 1.安装准备 HA虚拟IP:192.168.1.208 HA软件:Keepalived 操作系统:CentOS 7 用户:root 数据目录:/data/fastdfs ...