服务端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. 201521123107 《Java程序设计》第4周学习总结

    第4周作业-面向对象设计与继承 1.本周学习总结 2.书面作业 1.注释的应用 使用类的注释与方法的注释为前面编写的类与方法进行注释,并在Eclipse中查看.(截图) 对类的注释: 所得到的效果: ...

  2. 201521123024《Java程序设计》第7周学习总结

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

  3. Sublime Text编辑器如何隐藏顶部的菜单栏

    隐藏前: 解决办法: 1.按住Ctrl+Shifp+p,出现一个框,在框里输入“view:”,出现了如下界面 2.选择:“View:Toggle Menu”即可.结果为: 大功告成!!!!

  4. Eclipse rap 富客户端开发总结(5): RAP国际化之路

    Eclipse RCP 中的plugin.xml国际化实现 1.  在工程的根目录下面建立一个plugin.properties资源文件:在此资源文件中写入需要国际化的内容(键/值对),举例如下: h ...

  5. 如何在分布式环境中同步solr索引库和缓存信息

    天气依旧很好,主要是凉快.老习惯,我在北京向各位问好. 搜索无处不在,相信各位每天都免不了与它的亲密接触,那么我想你确实有必要来了解一下它们,就上周在公司实现的一个小需求来给各位分享一下:如何在分布式 ...

  6. python 中的%s是什么意思呢?

    今天忽然想写Python中的%s的意思,它怎么理解呢,我查阅了一下相关文献,然后结合了自己的理解,分析如下: 这是一个字符串格式化语法(这是从c 中调用的) 具体请参阅     http://www. ...

  7. 微信小程序--图片相关问题合辑

    图片上传相关文章 微信小程序多张图片上传功能 微信小程序开发(二)图片上传 微信小程序上传一或多张图片 微信小程序实现选择图片九宫格带预览 ETL:微信小程序之图片上传 微信小程序wx.preview ...

  8. Markdown使用简单示例

    标题示例: 标题一 #标题一 标题二 #标题二 标题三 ###标题三 标题四 ####标题四 标题五 #####标题五 标题六 ######标题六 连接示例 [![License](图片地址)](跳转 ...

  9. GCD之并行串行区别

    1.用户自定义线程队列,创建时很容易创建 注意创建时的第一个参数:标记值,方便调试查看 1 2 dispatch_queue_t serialqueue=dispatch_queue_create(& ...

  10. noip的一些模板(参考了神牛的博客)

    一.图论 1.单源最短路 洛谷P3371 (1)spfa 已加SLF优化 419ms #include <iostream> #include <cstdio> #includ ...