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 : 主机
1 var server = require("./server"); 2 var router = require("./router"); 3 var requestHandlers = require("./requestHandlers"); 4 var handle = {} 5 //handles启用 6 handle["/"] = requestHandlers.start; 7 handle["/start"] = requestHandlers.start; 8 handle["/upload"] = requestHandlers.upload; 9 server.start(router.route, handle);
Server.js :服务器
1 var http = require("http"); 2 var url = require("url"); 3 function start(route, handle) { 4 function onRequest(request, response) { 5 var pathname = url.parse(request.url).pathname; 6 console.log("Request for " + pathname + " received."); 7 route(handle, pathname, response, request); 8 } 9 http.createServer(onRequest).listen(8888); 10 console.log("Server has started."); 11 } 12 exports.start = start;
router.js :路由(依据handles[pathname])
1 function route(handle, pathname, response, request) { 2 console.log("About to route a request for " + pathname); 3 if (typeof handle[pathname] === 'function') { 4 handle[pathname](response, request); 5 } else { 6 console.log("No request handler found for " + pathname); 7 response.writeHead(404, {"Content-Type": "text/html"}); 8 response.write("404 Not found"); 9 response.end(); 10 } 11 } 12 exports.route = route;
requestHandlers.jss :处理程序
1 var querystring = require("querystring"), 2 fs = require("fs"), 3 formidable = require("formidable"); 4 var mylib=require("./mylib"); 5 var canvas = require('canvas'); 6 console.log('loading the database...'); 7 var DataSet=mylib.getDataSet(); 8 9 function start(response) { 10 var body = '<html>'+ 11 '<head>'+ 12 '<meta http-equiv="Content-Type" content="text/html; '+ 13 'charset=UTF-8" />'+ 14 '<br/><br/><br/>'+ 15 "<body background='http://localhost/myweb/groundback.jpg' repeat/>"+ 16 '</head>'+ 17 '<body>'+ 18 '<center>'+ 19 '<form action="/upload" enctype="multipart/form-data" '+ 20 'method="post">'+ 21 '<input type="file" name="upload" multiple="multiple" value="Brow">'+ 22 '<input type="submit" value="Retrieval" />'+ 23 '</form>'+ 24 '</center>'+ 25 '</body>'+ 26 '</html>'; 27 response.writeHead(200, {"Content-Type": "text/html"}); 28 response.write(body); 29 response.end(); 30 } 31 function upload(response, request) { 32 //Save :Query Image 33 var form = new formidable.IncomingForm(); 34 form.uploadDir = "tmp"; 35 form.parse(request, function(error, fields, files) { 36 fs.renameSync(files.upload.path, "./tmp/test.png"); 37 38 var iCanvas = new canvas(200,200); 39 var iCtx = iCanvas.getContext('2d'); 40 //Deal :Query Image 41 var img = new canvas.Image; 42 img.src ="./tmp/test.png"; 43 var qFeaSet=mylib.doWithQuery('test.png','tmp',img); 44 var Result_Intrieval=mylib.imgIntrieval(qFeaSet,DataSet); 45 var Name=Result_Intrieval[0]; 46 var dir_s=Result_Intrieval[1]; 47 48 //FeedBack Result 49 //Rename 50 var old_src='./tmp/test.png'; 51 var new_src='C:/AppServ/www/myweb/show/tmp/test.jpg'; 52 var fileReadStream = fs.createReadStream(old_src); 53 var fileWriteStream = fs.createWriteStream(new_src); 54 fileReadStream.pipe(fileWriteStream); 55 56 for (var ii=0;ii<Name.length;ii+=1){ 57 var old_src=dir_s+'/'+Name[ii]+'.jpg'; 58 var new_src='C:/AppServ/www/myweb/show/tmp/'+ii+'.jpg'; 59 var fileReadStream = fs.createReadStream(old_src); 60 var fileWriteStream = fs.createWriteStream(new_src); 61 fileReadStream.pipe(fileWriteStream); 62 63 if (ii==(Name.length-1)){ 64 for (var a=0;a<100000;a++){ 65 if(a==99999){ 66 fs.readFile('./show.html', function (err, html) { 67 if (err) { 68 throw err; 69 } 70 response.writeHeader(200, {"Content-Type": "text/html"}); 71 response.write(html); 72 response.end(); 73 }) 74 }}}} }) } 75 exports.start = start; 76 exports.upload = upload;
多重引号
JavaScript的引号嵌套时单引号和双引号是交替使用的,但是到第三层就会出现解析错误如:
'<a href="javascript: do('something');">'
这种用情况下something前的单引号会成为整个字符串的结束,解决方式:
'<a href="javascript: do(\'something\');">'
转义单引号即可,但是转义时不可用双引号:
'<a href="javascript: do(\"something\");">'
这样的话解析时,something前的双引号会被作为href属性的结束。
所以转义时也必须交替进行。
关于图片展示
不能直接用当前的相对路径或绝对路径,必须把图片作为资源加在进来。
NodeJS 与Html代码分离
1 var http = require('http'), 2 fs = require('fs'); 3 fs.readFile('./index.html', function (err, html) { 4 if (err) { 5 throw err; 6 } 7 http.createServer(function(request, response) { 8 response.writeHeader(200, {"Content-Type": "text/html"}); 9 response.write(html); 10 response.end(); 11 }) 12 });
调试:
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版本