
npm的常用指令修改镜像源为淘宝镜像源npm install -g cnpm --registryhttps://registry.npm.taobao.org设置为默认源npm config set registry http://registry.npmjs.org查看npm配置信息npm config list查看所有包列表npm list [-g]安装npm模块npm install Module_name [-g]如安装web框架 expressnpm install Module_name卸载npm模块npm uninstall Module_name升级npm模块npm update Module_name查找npm模块npm search Module_name创建npm模块npm init查看指令帮助npm help command_namenpm install 的几种类型npm install :会把Module包安装到node_modules目录中不会修改package.json之后运行npm install命令时不会自动安装Modulenpm install –save:会把Module包安装到node_modules目录中会在package.json的dependencies属性下添加Module之后运行npm install命令时会自动安装Module到node_modules目录中之后运行npm install–production或者注明NODE_ENV变量值为production时会自动安装msbuild到node_modules目录中npm install –save-dev:会把Module包安装到node_modules目录中会在package.json的devDependencies属性下添加Module之后运行npm install命令时会自动安装Module到node_modules目录中之后运行npm install–production或者注明NODE_ENV变量值为production时不会自动安装Module到node_modules目录中使用原则:运行时需要用到的包使用–save否则使用–save-dev (dev表开发环境)。npm 全局安装及本地安装的却别如npm install webpack -g与npm install webpack却别在使用时全局安装使用时这时:$ webpack ...本地安装为:$ node_modules/.bin/webpackNode.js介绍Node.js 是一个事件驱动I/O或者事件驱动IO 服务端JavaScript环境Node.js 是单进程单线程应用程序Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。Node.js REPL(交互式解释器)Node.js REPL(Read Eval Print Loop:交互式解释器) 表示一个电脑的环境类似 Window 系统的终端或 Unix/Linux shell$ nodevarx0undefineddo{...x;...console.log(x: x);...}while(x5);x:1x:2REPL常用命令ctrl c - 退出当前终端。tab 键 - 列出当前命令.help - 列出使用命令.clear - 退出多行表达式.save filename - 保存当前的 Node REPL 会话到指定文件.load filename - 载入当前 Node REPL 会话的文件内容。Node.js EventEmitterNode.js 所有的异步 I/O 操作在完成时都会发送一个事件到事件队列一个 net.Server 对象会在每次有新连接时触发一个事件 一个 fs.readStream 对象会在文件被打开的时候触发一个事件。 所有这些产生事件的对象都是 events.EventEmitter 的实例。如何使用// 引入 events 模块vareventsrequire(events);// 创建 eventEmitter 对象vareventEmitternewevents.EventEmitter();// 绑定一个匿名事件eventEmitter.on(bing_event,function(arg1,agr2){console.log(bing_event 事件被触发:arg1,agr2);});// 定义另一个事件处理方法varbing2_eventfunction(){console.log(bing2 事件被触发);eventEmitter.removeAllListeners(bing_event);console.log(所有监听bing_event的都移除了);}// 绑定一个已定义的事件处理方法到 bing_event中eventEmitter.on(bing_event,bing2_event);setTimeout(function(){eventEmitter.emit(bing_event,a1,a2);},1000);varlistenerNeventEmitter.listenerCount(bing_event);console.log(bing_event监听者数为listenerN);console.log(run end!);模块系统为了让Node.js的文件可以相互调用Node.js提供了一个简单的模块系统。一个文件就是一个模块该文件可能是 JavaScript 代码、JSON 或者编译过的C/C 扩展。// Hello.jsfunctionHello(){varname;this.setNamefunction(thyName){namethyName;}this.sayHellofunction(){console.log(Hello,my name is name);}}module.exportsHello;// index.jsvarHellorequire(./Hello);hellonewHello();hello.setName(Bing);hello.sayHello();console.log(demo end.);函数在JavaScript中一个函数可以作为另一个函数的参数。我们可以先定义一个函数然后传递也可以在传递参数的地方直接定义函数。Node.js中函数的使用与Javascript类似functionsay(msg){console.log(msg);}functionexec(sayFun,msg){sayFun(msg);}exec(say,hello js Function.);同样exec中的sayFun参数也可传递匿名函数.util实现对象继承(util.inherits)util.inherits(constructor, superConstructor) 是一个实现对象间原型继承的函数。varutilrequire(util);// 定义父类functionBaseObj(){this.namebaseObj;this.base1887;this.sayHellofunction(){console.log(Hello This is this.name);};}// 给父类添加定义原型方法BaseObj.prototype.showNamefunction(){console.log(this.name);};// 定义子类functionSubObj(){this.namesubObj;}// 使SubObj 继承 BaseObjutil.inherits(SubObj,BaseObj);varbaseObjnewBaseObj();baseObj.showName();baseObj.sayHello();console.log(baseObj);varsubObjnewSubObj();subObj.showName();//objSub.sayHello(); //这个方法无法输出会报错应该sayHello不是BaseObj的原型方法即不是通过BaseObj.prototype来定义的。console.log(subObj);注意SubObj 仅仅继承了BaseObj 在原型中定义的函数而构造函数内部创造的 base 属 性和 sayHello 函数都没有被 SubObj 继承。同时在原型中定义的属性不会被 console.log 作 为对象的属性输出。util.inspectutil.inspect(object,[showHidden],[depth],[colors]) 是一个将任意对象转换 为字符串的方法通常用于调试和错误输出。它至少接受一个参数 object即要转换的对象。showHidden 是一个可选参数如果值为 true将会输出更多隐藏信息。depth 表示最大递归的层数如果对象很复杂你可以指定层数以控制输出信息的多 少。如果不指定depth默认会递归2层指定为 null 表示将不限递归层数完整遍历对象。 如果color 值为 true输出格式将会以ANSI 颜色编码通常用于在终端显示更漂亮 的效果。特别要指出的是util.inspect 并不会简单地直接把对象转换为字符串即使该对 象定义了 toString 方法也不会调用。Node.js 文件系统异步的 fs.readFile() 和同步的 fs.readFileSync()varfsrequire(fs);// 异步读取fs.readFile(input.txt,function(err,data){if(err){returnconsole.error(err);}console.log(异步读取: data.toString());});// 同步读取vardatafs.readFileSync(input.txt);console.log(同步读取: data.toString());console.log(程序执行完毕。);Node.js GET/POST请求Get请求,如何获取表求的url信息varhttprequire(http);varurlrequire(url);varutilrequire(util);http.createServer(function(req,res){// 解析 获取url参数varparamsurl.parse(req.url,true).query;//true为解析为对象访问参数console.log(params);// 完成原生的urlconsole.log(req.url :req.url);// 获取干净的url不带参数varpathnameurl.parse(req.url).pathname;varreHtmlYour URL : req.url\n;reHtmlURL pathname : pathname\n;reHtmlURL Params :url.parse(req.url).query;res.writeHead(200,{Content-Type:text/plain; charsetutf-8});res.end(reHtml);}).listen(8888);console.log(server is running ...);Post请求如何获取body内容POST 请求的内容全部的都在请求体中http.ServerRequest 并没有一个属性内容为请求体原因是等待请求体传输可能是一件耗时的工作。比如上传文件而很多时候我们可能并不需要理会请求体的内容恶意的POST请求会大大消耗服务器的资源所以 node.js 默认是不会解析请求体的当你需要的时候需要手动来做。varhttprequire(http);varquerystringrequire(querystring);varpostHTMLhtmlheadmeta charsetutf-8titlePost 实现/title/headbodyform methodpost网站名 input namenamebr网站 URL input namevaluebrinput typesubmit/form/body/html;http.createServer(function(req,res){varbody;req.on(data,function(chunk){bodychunk;});req.on(end,function(){// 解析参数bodyquerystring.parse(body);// 设置响应头部信息及编码res.writeHead(200,{Content-Type:text/html; charsetutf8});if(body.namebody.url){// 输出提交的数据res.write(namebody.name);res.write(br);res.write(valuebody.url);}else{// 输出表单res.write(postHTML);}res.end();});}).listen(8888);console.log(server is running ...);