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

    1.本周学习总结 #1.1 尝试使用思维导图总结有关多态与接口的知识点. 2.书面作业 #1.代码阅读:Child压缩包内源代码##1.1 com.parent包中Child.java文件能否编译通过 ...

  2. PHP字符串常用操作

    常用操作有: PHP中有两个内建的函数:count() 和sizeof(),可以实现得到数组的长度 count($sttr);数组长度 字符串长度:strlen(string $a); 判断是否相同, ...

  3. UVW源码漫谈(二)

    前一篇发布出来之后,我看着阅读量还是挺多的,就是评论和给意见的一个都没有,或许各位看官就跟我一样,看帖子从不回复,只管看就行了.毕竟大家都有公务在身,没太多时间,可以理解.不过没关系,我是不是可以直接 ...

  4. 06jQuery-06-AJAX

    1.JS的AJAX AJAX,Asynchronous JavaScript and XML,意思就是用JavaScript执行异步网络请求. 如果要让用户留在当前页面中,同时发出新的HTTP请求,就 ...

  5. JSTL常用标签

    JSTL标签常用:http://blog.csdn.net/imust_can/article/details/6965756

  6. Hibernate映射乱码

    1.修改数据库字符集:将数据库默认编码设置为UTF-8 CHARSET=utf8 2.配置Hibernate环境时将数据库URL设置成: jdbc:mysql://localhost:3306/dbN ...

  7. Linux中组 与 用户的管理

    在linux中建立组的指令是 groupadd 组名 相应的,删除组的指令: groupdel 组名 查看自己用户的组: groups 一个用户可以在多个组里面,用这个命令可以将用户添加到组: add ...

  8. Java简单实用方法一

    整理以前的笔记,在学习Java时候,经常会用到一些方法.虽然简单但是经常使用.因此做成笔记,方便以后查阅 这篇博文先说明构造和使用这些方法. 1,判断String类型数据是否为空 String类型的数 ...

  9. 利用ASP.NET操作IIS (可以制作安装程序)

    很多web安装程序都会在IIS里添加应用程序或者应用程序池,早期用ASP.NET操作IIS非常困难,不过,从7.0开始,微软提供了 Microsoft.Web.Administration 类,可以很 ...

  10. 微信公众号开发——关于“WeixinJSBridge.call('closeWindow');”无效的问题

    最近在做微信公众号的开发,再做一个jsp的用户绑定页面,设置了一个timestamp,想实现的是当链接超时时alert一个窗口提示然后关闭网页窗口 但是呢,在jsp页面内直接 out.print(&q ...