服务端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. IT之光

    作为一个IT界的新新人才,现在拥有第一个博客,可以在这里学习和分享IT方面的知识和技术.

  2. 201521044091《java程序设计》第四次总结

    1. 本周学习总结 1.1 尝试使用思维导图总结有关继承的知识点. 1.11.2 使用常规方法总结其他上课内容 Object是所有对象类的父类,而toString方法只有可以转换为字符串的类型对象才可 ...

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

    1. 本周学习总结 动态数组 标识控制符的意义 ArrayList ,BigDecimal,BigInteger 等类的使用 组合,继承,多态等概念的了解 2. 书面作业 Q1.使用Eclipse关联 ...

  4. Linux命令行学习

    "mkdir + 文件夹名字" 创建文件夹 "pwd" 显示当前工作目录的绝对路径. "touch" 创建空文件. "cat /p ...

  5. 201521123056 《Java程序设计》第10周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. 2. 书面作业 本次PTA作业题集异常.多线程 1. finally 题目4-2 1.1 截图你的提交结果( ...

  6. 201521123066 《Java程序设计》第十二周实验总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 将Student对象(属性:int id, String name,int age,doubl ...

  7. foreach嵌套循环

    最近几天被这个嵌套搞晕了,还好经过几天的努力终于解决了,特记录下,因为要传两个List集合到jsp页面,还都是在一起输出,发现不能把两个集合放在一个foreach,所以就写了两个foreach来接受, ...

  8. 纯css隐藏移动端滚动条解决方案(ios上流畅滑动)

    纯css隐藏移动端滚动条解决方案(ios上流畅滑动) html代码展示(直接复制代码保存至本地文件运行即可): <!DOCTYPE html> <html lang="en ...

  9. JVM菜鸟进阶高手之路六(JVM每隔一小时执行一次Full GC)

    转载请注明原创出处,谢谢! 上次分析详细地址在:http://www.jianshu.com/p/a6236cd39e2d 以为上次问题是rmi的问题就此结束了,但是问题并没有结束,其实本次问题不是r ...

  10. [UIKit学习]05.关于plist

    plist是一种iOS本地化轻量级存储方式 创建plist 选择New File-> Resource->plist 加载plist //获得Plist文件的全路径 NSBundle *b ...