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手札的更多相关文章

  1. JavaScript手札:《编写高质量JS代码的68个有效方法》(一)(1~5)

    编写高质量JS代码的68个有效方法(一) *:first-child { margin-top: 0 !important; } body>*:last-child { margin-botto ...

  2. Batsing的网页编程规范(HTML/CSS/JS/PHP)

    特别注意!!!我这里的前端编程规范不苟同于Bootstrap的前端规范. 因为我和它的目的不同,Bootstrap规范是极简主义,甚至有些没有考虑到兼容性的问题. 我的规范是自己从编程实践中总结出来的 ...

  3. 转-Spring 注解学习手札(七) 补遗——@ResponseBody,@RequestBody,@PathVariable

    转-http://snowolf.iteye.com/blog/1628861/ Spring 注解学习手札(七) 补遗——@ResponseBody,@RequestBody,@PathVariab ...

  4. Spring 注解学习手札(七) 补遗——@ResponseBody,@RequestBody,@PathVariable(转)

    最近需要做些接口服务,服务协议定为JSON,为了整合在Spring中,一开始确实费了很大的劲,经朋友提醒才发现,SpringMVC已经强悍到如此地步,佩服! 相关参考: Spring 注解学习手札(一 ...

  5. (数据科学学习手札50)基于Python的网络数据采集-selenium篇(上)

    一.简介 接着几个月之前的(数据科学学习手札31)基于Python的网络数据采集(初级篇),在那篇文章中,我们介绍了关于网络爬虫的基础知识(基本的请求库,基本的解析库,CSS,正则表达式等),在那篇文 ...

  6. (数据科学学习手札47)基于Python的网络数据采集实战(2)

    一.简介 马上大四了,最近在暑期实习,在数据挖掘的主业之外,也帮助同事做了很多网络数据采集的内容,接下来的数篇文章就将一一罗列出来,来续写几个月前开的这个网络数据采集实战的坑. 二.马蜂窝评论数据采集 ...

  7. 通过js检测浏览器支持的字体,从而显示支持的字体,让用户选择。

    http://www.zhangxinxu.com/wordpress/2018/02/js-detect-suppot-font-family/ 本文根据张鑫旭文章. 字体函数: var dataF ...

  8. (数据科学学习手札80)用Python编写小工具下载OSM路网数据

    本文对应脚本已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 我们平时在数据可视化或空间数据分析的过程中经常会 ...

  9. Vue.js 和 MVVM 小细节

    MVVM 是Model-View-ViewModel 的缩写,它是一种基于前端开发的架构模式,其核心是提供对View 和 ViewModel 的双向数据绑定,这使得ViewModel 的状态改变可以自 ...

随机推荐

  1. Spark机器学习示例

    1. Java代码 /* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor lice ...

  2. linux 命令行启动虚拟机

    vmrun -T ws start /root/vmware/Windows\ Server\ 2012/Windows\ Server\ 2012.vmx nogui

  3. Provisioning Services 7.6 入门到精通系列之一:PVS前期规划

    1.  Provisioning Services 产品概述 Provisioning Services (简称PVS)采用了一种与传统映像解决方案截然不同的方法,从根本上改变了硬件与依托硬件而运行的 ...

  4. SpringMVC 处理数据模型

    处理模型数据 Spring MVC 提供了以下几种途径输出模型数据: ModelAndView: 处理方法返回值类型为 ModelAndView 时, 方法体即可通过该对象添加模型数据 Map 及 M ...

  5. http post和put区别

    POST是用来提交数据的.提交的数据放在HTTP请求的正文里,目的在于提交数据并用于服务器端的存储,而不允许用户过多的更改相应数据(主要是相对于在url 修改要麻烦很多).PUT操作是幂等的.所谓幂等 ...

  6. sja1000T can相关的知识

    开发环境:硬件环境arm9200 sja1000T,软件环境kernel version 2.6.21.驱动程序:字符驱动 can有两种基本的工作模式:basic can .pelican,pelic ...

  7. ibatis入门教程

    转载自  http://www.cnblogs.com/ycxyyzw/archive/2012/10/13/2722567.html iBatis 简介: iBatis 是apache 的一个开源项 ...

  8. dedecms qq咨询平均分配

    qq后台页: qq_admin.php <style type="text/css"> <!-- * {margin:0; padding:0;} .wrap { ...

  9. Mac上安装与更新Ruby,Rails运行环境

    Mac安装后就安装Xcode是个好主意,它将帮你安装好Unix环境需要的开发包,也可以独立安装command_line_tools_for_xcode 1.安装RVM RVM:Ruby Version ...

  10. Configure the max limit for concurrent TCP connections(转)

    To keep the TCP/IP stack from taking all resources on the computer, there are different parameters t ...