JS手札
Node JS
关于JS调用
被调用:exports.cv=cv;
cv为类,可以使用其方法cv.***;
cv为函数名,可以使用其函数cv( , );
调用: var cv=require(cv);
路径:
绝对:/.../.../xxx.js
相对:./xxx.js(同一个文件夹下)
上一级目录:../
否则,要么是核心模块,要么是从node_modules文件夹加在
文件夹作为模块:
在文件夹的根下建立package.json文件夹,表示了一个主模块,可能内容为:
    { "name" : "some-library",  
"main" : "./lib/some-library.js" }
如果这个是在一个文件夹./some-library下,那么require(’./some-library)时,将试图加载./some-library/lib/some-library.js;
如果这个目录下吗,没有package.json文件,那么node将试图从这个目录下加在index.js或者index.node文件。例如,如果上面没有package.json文件,那么require('./some-library')时,将试图加载下面的文件:
./some-library/index.js
./some-library/index.node
服务器架构
Index.js : 主机
     var server = require("./server");
     var router = require("./router");
     var requestHandlers = require("./requestHandlers");
     var handle = {}
     //handles启用
     handle["/"] = requestHandlers.start;
     handle["/start"] = requestHandlers.start;
     handle["/upload"] = requestHandlers.upload;
     server.start(router.route, handle);
Server.js :服务器
 var http = require("http");
     var url = require("url");
     function start(route, handle) {
         function onRequest(request, response) {
                 var pathname = url.parse(request.url).pathname;
                 console.log("Request for " + pathname + " received.");
                 route(handle, pathname, response, request);
           }
           http.createServer(onRequest).listen(8888);
            console.log("Server has started.");
 }
     exports.start = start;
router.js :路由(依据handles[pathname])
     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/html"});
     response.write("404 Not found");
     response.end();
   }
 }
 exports.route = route;
requestHandlers.jss :处理程序
     var querystring = require("querystring"),
     fs = require("fs"),
     formidable = require("formidable");
     var mylib=require("./mylib");
     var canvas = require('canvas');
     console.log('loading the database...');
     var DataSet=mylib.getDataSet();
     function start(response) {
       var body = '<html>'+
     '<head>'+
     '<meta http-equiv="Content-Type" content="text/html; '+
     'charset=UTF-8" />'+
     '<br/><br/><br/>'+
     "<body background='http://localhost/myweb/groundback.jpg' repeat/>"+
     '</head>'+
     '<body>'+
     '<center>'+
     '<form action="/upload" enctype="multipart/form-data" '+
     'method="post">'+
     '<input type="file" name="upload" multiple="multiple" value="Brow">'+
     '<input type="submit" value="Retrieval" />'+
     '</form>'+
     '</center>'+
     '</body>'+
     '</html>';
     response.writeHead(200, {"Content-Type": "text/html"});
     response.write(body);
     response.end();
 }
 function upload(response, request) {
     //Save :Query Image
        var form = new formidable.IncomingForm();
     form.uploadDir = "tmp";
     form.parse(request, function(error, fields, files) {
     fs.renameSync(files.upload.path, "./tmp/test.png");
        var  iCanvas = new canvas(200,200);
     var  iCtx = iCanvas.getContext('2d');
      //Deal :Query Image
     var img = new canvas.Image;
     img.src ="./tmp/test.png";
     var qFeaSet=mylib.doWithQuery('test.png','tmp',img);
     var Result_Intrieval=mylib.imgIntrieval(qFeaSet,DataSet);
     var Name=Result_Intrieval[0];
     var dir_s=Result_Intrieval[1];
     //FeedBack Result
     //Rename
     var old_src='./tmp/test.png';
     var new_src='C:/AppServ/www/myweb/show/tmp/test.jpg';
     var fileReadStream = fs.createReadStream(old_src);
     var fileWriteStream = fs.createWriteStream(new_src);
     fileReadStream.pipe(fileWriteStream);
     for (var ii=0;ii<Name.length;ii+=1){
     var old_src=dir_s+'/'+Name[ii]+'.jpg';
     var new_src='C:/AppServ/www/myweb/show/tmp/'+ii+'.jpg';
     var fileReadStream = fs.createReadStream(old_src);
     var fileWriteStream = fs.createWriteStream(new_src);
     fileReadStream.pipe(fileWriteStream);
 if (ii==(Name.length-1)){
 for (var a=0;a<100000;a++){
 if(a==99999){
 fs.readFile('./show.html', function (err, html) {
     if (err) {
         throw err;
     }
         response.writeHeader(200, {"Content-Type": "text/html"});
         response.write(html);
         response.end();
 })
 }}}} }) }
 exports.start = start;
 exports.upload = upload;
多重引号
JavaScript的引号嵌套时单引号和双引号是交替使用的,但是到第三层就会出现解析错误如:
'<a href="javascript: do('something');">'
这种用情况下something前的单引号会成为整个字符串的结束,解决方式:
'<a href="javascript: do(\'something\');">'
转义单引号即可,但是转义时不可用双引号:
'<a href="javascript: do(\"something\");">'
这样的话解析时,something前的双引号会被作为href属性的结束。
所以转义时也必须交替进行。
关于图片展示
不能直接用当前的相对路径或绝对路径,必须把图片作为资源加在进来。
NodeJS 与Html代码分离
     var http = require('http'),
            fs = require('fs');
 fs.readFile('./index.html', function (err, html) {
     if (err) {
         throw err;
     }
     http.createServer(function(request, response) {
         response.writeHeader(200, {"Content-Type": "text/html"});
         response.write(html);
         response.end();
     })
 });  
调试:
Chrome :Inspector node --debug-brk a.js=>http://localhost:8080/debug?port=5858
命令 功能
run 执行脚本,在第一行暂停
restart 重新执行脚本
cont, c 继续执行,直到遇到下一个断点
next, n 单步执行
step, s 单步执行并进入函数
out, o 从函数中步出
setBreakpoint(), sb() 当前行设置断点
setBreakpoint(‘f()’), sb(...) 在函数f的第一行设置断点
setBreakpoint(‘script.js’, 20), sb(...) 在 script.js 的第20行设置断点
clearBreakpoint, cb(...) 清除所有断点
backtrace, bt 显示当前的调用栈
list(5) 显示当前执行到的前后5行代码
watch(expr) 把表达式 expr 加入监视列表
unwatch(expr) 把表达式 expr 从监视列表移除
watchers 显示监视列表中所有的表达式和值
repl 在当前上下文打开即时求值环境
kill 终止当前执行的脚本
scripts 显示当前已加载的所有脚本
version 显示v8版本
JS手札的更多相关文章
- JavaScript手札:《编写高质量JS代码的68个有效方法》(一)(1~5)
		
编写高质量JS代码的68个有效方法(一) *:first-child { margin-top: 0 !important; } body>*:last-child { margin-botto ...
 - Batsing的网页编程规范(HTML/CSS/JS/PHP)
		
特别注意!!!我这里的前端编程规范不苟同于Bootstrap的前端规范. 因为我和它的目的不同,Bootstrap规范是极简主义,甚至有些没有考虑到兼容性的问题. 我的规范是自己从编程实践中总结出来的 ...
 - 转-Spring 注解学习手札(七) 补遗——@ResponseBody,@RequestBody,@PathVariable
		
转-http://snowolf.iteye.com/blog/1628861/ Spring 注解学习手札(七) 补遗——@ResponseBody,@RequestBody,@PathVariab ...
 - Spring 注解学习手札(七) 补遗——@ResponseBody,@RequestBody,@PathVariable(转)
		
最近需要做些接口服务,服务协议定为JSON,为了整合在Spring中,一开始确实费了很大的劲,经朋友提醒才发现,SpringMVC已经强悍到如此地步,佩服! 相关参考: Spring 注解学习手札(一 ...
 - (数据科学学习手札50)基于Python的网络数据采集-selenium篇(上)
		
一.简介 接着几个月之前的(数据科学学习手札31)基于Python的网络数据采集(初级篇),在那篇文章中,我们介绍了关于网络爬虫的基础知识(基本的请求库,基本的解析库,CSS,正则表达式等),在那篇文 ...
 - (数据科学学习手札47)基于Python的网络数据采集实战(2)
		
一.简介 马上大四了,最近在暑期实习,在数据挖掘的主业之外,也帮助同事做了很多网络数据采集的内容,接下来的数篇文章就将一一罗列出来,来续写几个月前开的这个网络数据采集实战的坑. 二.马蜂窝评论数据采集 ...
 - 通过js检测浏览器支持的字体,从而显示支持的字体,让用户选择。
		
http://www.zhangxinxu.com/wordpress/2018/02/js-detect-suppot-font-family/ 本文根据张鑫旭文章. 字体函数: var dataF ...
 - (数据科学学习手札80)用Python编写小工具下载OSM路网数据
		
本文对应脚本已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 我们平时在数据可视化或空间数据分析的过程中经常会 ...
 - Vue.js 和 MVVM 小细节
		
MVVM 是Model-View-ViewModel 的缩写,它是一种基于前端开发的架构模式,其核心是提供对View 和 ViewModel 的双向数据绑定,这使得ViewModel 的状态改变可以自 ...
 
随机推荐
- JavaEE Log4j
			
1.Log4j是Apache的一个开放源代码项目,可以通过一个配置文件来灵活的进行配置,而不需要修改应用的代码. 2.Log4j有三个主要部件组成: 记录器:按照布局中指定的格式把日志信息写入一个或多 ...
 - 端口限制情况下php+xdebug环境配置
			
PHP程序在开发的时候调试是比较方便的,大体情况下,输出,打log是可以解决几乎所有问题. 但是还不够,有些问题,用打log的形式定位问题是相当痛苦的事情,有些时候测试环境没配好的话,你可能需要做许多 ...
 - http——tinyhttp分析
			
1.前言: 1)tinyhttpd是一个500行+的http服务器 2)支持迭代和多线程并发两种服务器模型 3)支持GET和POST方法 4)支持CGI(fork.execl方式) 5)虽然响应的ht ...
 - css 之 文本缩进属性(text-indent)
			
文章转自:http://www.10wy.net/Article/CSS/CSS_list_8.html查看更多更专业性的文章请到:网页设计网 文本缩进属性(text-indent) 这个属性设定文本 ...
 - 执行时关闭标识位 FD_CLOEXEC 的作用
			
首先先回顾 apue 中对它的描述: ① 表示描述符在通过一个 exec 时仍保持有效(书P63,3.14节 fcntl 函数,在讲 F_DUPFD 时顺便提到) ② 对打开文件的处理与每个描述符的执 ...
 - String Date Calendar之间的转换
			
1.Calendar 转化 String Calendar calendat = Calendar.getInstance(); SimpleDateFormat sdf = new SimpleDa ...
 - 为什么eclipse中代码提示错误,但是项目目录却不提示错误
			
public class Aasf { public static void main(String[] args) { System.out.println("");aihfsa ...
 - [DNS][转]EDNS
			
随着业务的复杂化和多样化,RFC1035中定义的DNS消息格式和它支持的消息内容已经不足以满足一些DNS服务器的需求,于是,RFC2671 中提出了一种扩展DNS机制EDNS(Extension Me ...
 - CodeSimth - .Net Framework Data Provider 可能没有安装
			
使用CodeSimth 连接SQLite数据库库 提示错误 codesmith 6以上的版本,说是支持sqlite生成,也有对应的sqliteprovider.dll,但是使用时却说Test fail ...
 - .NET/android/java/iOS AES通用加密解密(修正安卓)
			
移动端越来越火了,我们在开发过程中,总会碰到要和移动端打交道的场景,比如.NET和android或者iOS的打交道.为了让数据交互更安全,我们需要对数据进行加密传输.今天研究了一下,把几种语言的加密都 ...