搜索词>>nodejs 耗时0.0020
  • nodejs中http模块使用简单demo

    nodejs中http模块使用简单demo<h2>1.编写一个见得server.js</h2> server.js内容: <pre> <code class="language-javascript"> var http = require('http') ; var server = http.createServer(function(req,res){ res.writeHeader(200,{ 'Content-Type' : 'text/plain;charset=utf-8', // 添加charset=utf-8, 'Access-Control-Allow-Origin':'*',//跨域支持 'Access-Control-Allow-Methods':'*'//跨域支持 }) ; res.end("Hello,NodeJS!") ; }) ; server.listen(8888) ; console.log("http server running on port 8888 ...") ;</code></pre> <h2>2.启动server.js</h2> <br /> cmd命令: <pre> <code>node server.js</code></pre> <h2><img alt="cmd" class="img-thumbnail" src="/assist/images/blog/302e7f1e7eb6492abf071383856352a4.png" /><br /> 3.编写一个简单的HTML,通过ajax请求访问</h2> <pre> <code class="language-html"><!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <button class="btn-test">点击请求nodejs接口</button> <script src="jquery.min.js"></script> <script type="text/javascript"> $(function(){ $('.btn-test').click(function(){ $.ajax({ url:'http://localhost:8888',//刚才的server.js提供的简单服务http接口 type:'GET', success:function(result){ alert("接口返回数据内容:"+result); } }); }); }); </script> </body> </html></code></pre> <br /> 执行结果:<br /> <img alt="node http" class="img-thumbnail" src="/assist/images/blog/ebdbf804a3194213b13610e9ff0a1cec.png" />
  • java编程中使用nodejs的apidoc工具生成Java api文档

    java编程中使用nodejs的apidoc工具生成Java api美观的HTML文档,apidoc可以根据代码注释生成web api文档,支持大部分主流语言java编程中使用nodejs的apidoc工具生成Java api文档,apidoc可以根据代码注释生成web api文档,支持大部分主流语言<br /> 1.下载安装nodejs环境,(已安装请忽略)<br /> 下载地址:http://nodejs.cn/download/<br /> 如果不是很会,推荐下载msi文件格式的,会自动集成到系统中<br /> 2.安装apidoc工具<br /> 弹出:cmd窗口输入以下命令安装: <pre> <code>npm install apidoc -g</code></pre> 3.创建一些配置和文件夹<br />  创建一个存放Java源代码的文件夹myapp<br />  创建一个存放生成api文档的文件夹apidoc<br /> 4.创建json配置文件<br /> 在存放Java代码的根目录创建apidoc.json <pre> <code class="language-json">{ "name": "example", "version": "0.1.0", "description": "apiDoc basic example", "title": "Custom apiDoc browser title", "url" : "https://api.github.com/v1" }</code></pre> <br /> 5.执行命令 <pre> <code>apidoc -i pathto/myapp/ -o pathto/apidoc/</code></pre> 6.支持的api注释<br /> <img alt="注释" class="img-thumbnail" src="/assist/images/blog/e49a7f29-c8b4-4b91-9f1b-2930c7610a4b.png" /><br /> java example: <pre> <code class="language-java">package net.xqlee.example import net.xqlee.common.pojo.Result; /** *测试DOC * * @author xqlee * */ @RestController public class Example { /** * @apiVersion 1.0.0 * * @api {get} /apis/example.json 获取验证码 * * @apiName doexample * * @apiGroup exampleGroup * * @apiPermission none * * @apiParam {String} [timeStamp] 时间戳 * @apiParam {String} timeStamp2 时间戳2 * * @apiSuccessExample {json} 成功返回值: * { "id": "1be34f4a324c4123b0325ecf0593d70e", "data": { "image": "iVBORwCCAAAAAAAAAAAAAAAAA==" }, "code": "00000", "dateTime": "2017-05-23 14:00:23", "msg": null } * @apiErrorExample {json} 失败返回值: *{ "id": "1be34f4a324c4123b0325ecf0593d70e", "data": "", "code": "EEEEE", "dateTime": "2017-05-23 14:00:23", "msg": "系统异常" } */ @GetMapping("/apis/validation/getcode.json") public Result example(String name,String sex) { return "{}"; } } </code></pre> <br /> 7.其他参数参考<br /> http://apidocjs.com/#params<br /> <br />  
  • npm配置国内镜像源

    npm配置国内镜像源环境说明下载的nodejs版本10.80安装nodejs后自带的npm版本为6.2.0初始化npm新装的npm需要执行初始化命令来配置一些信息,生成package.json初始化命令npm init会提示输入一些基本信息如名称、国别、许可等等,如果不需要特别设置一路回车即可配置国内npm镜像源临时配置:npm --registry https://registry.npm.taobao.org install express永久配置npm config set registry https://registry.npm.taobao.org验证命令npm config get registry或者npm info express
  • ajax和axios、fetch 区别

    1.jQuery ajax$.ajax({ type: 'POST', url: url, data: data, dataType: dataType, success: function () {},1.jQuery ajax$.ajax({ type: 'POST', url: url, data: data, dataType: dataType, success: function () {}, error: function () {} });传统 Ajax 指的是 XMLHttpRequest(XHR), 最早出现的发送后端请求技术,隶属于原始js中,核心使用XMLHttpRequest对象,多个请求之间如果有先后关系的话,就会出现回调地狱。JQuery ajax 是对原生XHR的封装,除此以外还增添了对JSONP的支持。经过多年的更新维护,真的已经是非常的方便了,优点无需多言;如果是硬要举出几个缺点,那可能只有:1.本身是针对MVC的编程,不符合现在前端MVVM的浪潮2.基于原生的XHR开发,XHR本身的架构不清晰。3.JQuery整个项目太大,单纯使用ajax却要引入整个JQuery非常的不合理(采取个性化打包的方案又不能享受CDN服务)4.不符合关注分离(Separation of Concerns)的原则5.配置和调用方式非常混乱,而且基于事件的异步模型不友好。PS:MVVM(Model-View-ViewModel), 源自于经典的 Model–View–Controller(MVC)模式。MVVM 的出现促进了 GUI 前端开发与后端业务逻辑的分离,极大地提高了前端开发效率。MVVM 的核心是 ViewModel 层,它就像是一个中转站(value converter),负责转换 Model 中的数据对象来让数据变得更容易管理和使用,该层向上与视图层进行双向数据绑定,向下与 Model 层通过接口请求进行数据交互,起呈上启下作用。View 层展现的不是 Model 层的数据,而是 ViewModel 的数据,由 ViewModel 负责与 Model 层交互,这就完全解耦了 View 层和 Model 层,这个解耦是至关重要的,它是前后端分离方案实施的最重要一环。如下图所示:​2.axiosaxios({ method: 'post', url: '/user/12345', data: { firstName: 'Fred', lastName: 'Flintstone' } }) .then(function (response) { console.log(response); }) .catch(function (error) { console.log(error); });Vue2.0之后,尤雨溪推荐大家用axios替换JQuery ajax,想必让axios进入了很多人的目光中。axios 是一个基于Promise 用于浏览器和 nodejs 的 HTTP 客户端,本质上也是对原生XHR的封装,只不过它是Promise的实现版本,符合最新的ES规范,它本身具有以下特征:1.从浏览器中创建 XMLHttpRequest2.支持 Promise API3.客户端支持防止CSRF4.提供了一些并发请求的接口(重要,方便了很多的操作)5.从 node.js 创建 http 请求6.拦截请求和响应7.转换请求和响应数据8.取消请求9.自动转换JSON数据PS:防止CSRF:就是让你的每个请求都带一个从cookie中拿到的key, 根据浏览器同源策略,假冒的网站是拿不到你cookie中得key的,这样,后台就可以轻松辨别出这个请求是否是用户在假冒网站上的误导输入,从而采取正确的策略。3.fetchtry { let response = await fetch(url); let data = response.json(); console.log(data); } catch(e) { console.log("Oops, error", e); }fetch号称是AJAX的替代品,是在ES6出现的,使用了ES6中的promise对象。Fetch是基于promise设计的。Fetch的代码结构比起ajax简单多了,参数有点像jQuery ajax。但是,一定记住fetch不是ajax的进一步封装,而是原生js,没有使用XMLHttpRequest对象。fetch的优点:1.符合关注分离,没有将输入、输出和用事件来跟踪的状态混杂在一个对象里2.更好更方便的写法坦白说,上面的理由对我来说完全没有什么说服力,因为不管是Jquery还是Axios都已经帮我们把xhr封装的足够好,使用起来也足够方便,为什么我们还要花费大力气去学习fetch?我认为fetch的优势主要优势就是:1.语法简洁,更加语义化 2.基于标准 Promise 实现,支持 async/await 3.同构方便,使用 [isomorphic-fetch](https://github.com/matthew-andrews/isomorphic-fetch) 4.更加底层,提供的API丰富(request, response) 5.脱离了XHR,是ES规范里新的实现方式最近在使用fetch的时候,也遇到了不少的问题:fetch是一个低层次的API,你可以把它考虑成原生的XHR,所以使用起来并不是那么舒服,需要进行封装。例如:1)fetch只对网络请求报错,对400,500都当做成功的请求,服务器返回 400,500 错误码时并不会 reject,只有网络错误这些导致请求不能完成时,fetch 才会被 reject。 2)fetch默认不会带cookie,需要添加配置项: fetch(url, {credentials: 'include'}) 3)fetch不支持abort,不支持超时控制,使用setTimeout及Promise.reject的实现的超时控制并不能阻止请求过程继续在后台运行,造成了流量的浪费 4)fetch没有办法原生监测请求的进度,而XHR可以总结axios既提供了并发的封装,也没有fetch的各种问题,而且体积也较小,当之无愧现在最应该选用的请求的方式。
  • Spring MVC 5 接受对象集合/数组参数实战

    Spring MVC 5 接受对象集合参数实战,在之前,我一直以为http传输的参数是KEY-VALUE键值对的方式和文件流的形式。直到最近遇到新需求才知道还有一种RAW的数据类型。通过这种原生的数据类型进行传输需要指定传输的格式也就是HTTP的头部content type。接下来也将用raw这个类型的传输方式来实现mvc的对象集合参数接收。 ​​​​​​​<h2>引言</h2>     在之前,我一直以为http传输的参数是KEY-VALUE键值对的方式和文件流的形式。直到最近遇到新需求才知道还有一种RAW的数据类型。通过这种原生的数据类型进行传输需要指定传输的格式也就是HTTP的头部content type。接下来也将用raw这个类型的传输方式来实现mvc的对象集合参数接收。 <h2>一.创建一个spring mvc的web项目</h2>   为了方便,我这里创建的一个spring boot的web项目。大家都知道spring boot来创建spring 的web项目是非常快的。<br /> <br /> 下面是项目的结构图:<br /> <br /> <img alt="spring boot web项目结构图" class="img-thumbnail" src="/assist/images/blog/77431d8d204b4b8b8c5137cc5fc8b1f8.png" /> <h2>二.实战spring mvc 5接收集合对象参数编码</h2> <h3>2.1创建一个pojo对象</h3> 这里创建的一个Person的简单对象。该对象主要用来等会传递参数使用。 <pre> <code class="language-java">package net.xqlee.project.pojo; /** * 简单对象 * * @author xqlee * */ public class Persion { private String id; private String name; @Override public String toString() { return "ID:" + id + ",name:" + name; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } } </code></pre> *可以看到这个对象确实挺简单的。就两个属性以及属性的get/set方法。重写了下toString()方法用来等会打印输出测试。 <h3>2.2创建一个controller用来接收数组/集合对象</h3> <pre> <code class="language-java">package net.xqlee.project.controller; import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; import net.xqlee.project.pojo.Persion; @RestController public class TestController { private static final Logger log = LoggerFactory.getLogger(TestController.class); @PostMapping("arrParams.json") public Object arrParams(@RequestBody List<Persion> list) { for (Persion persion : list) { log.info(persion.toString()); } return true; } } </code></pre> *注意,上面实现接收集合/数组对象的主要在于注解@RequestBody他会将请求的内容进行封装到list(如果请求的格式符合bean的要求) <h2>三.演示实战</h2> <h3>3.1启动spring boog项目</h3> <pre> <code class="language-html"> . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v2.0.0.M6) 2017-11-19 20:20:38.489 INFO 1888 --- [ main] n.x.p.DemoSpringbootPublicApplication : Starting DemoSpringbootPublicApplication on DESKTOP-2RG0A6O with PID 1888 (D:\workplace\eclipse_mvn\demo-springboot-public\target\classes started by xqlee in D:\workplace\eclipse_mvn\demo-springboot-public) 2017-11-19 20:20:38.492 INFO 1888 --- [ main] n.x.p.DemoSpringbootPublicApplication : No active profile set, falling back to default profiles: default 2017-11-19 20:20:38.535 INFO 1888 --- [ main] ConfigServletWebServerApplicationContext : Refreshing org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@419c5f1a: startup date [Sun Nov 19 20:20:38 CST 2017]; root of context hierarchy 2017-11-19 20:20:39.664 INFO 1888 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http) 2017-11-19 20:20:39.676 INFO 1888 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat] 2017-11-19 20:20:39.677 INFO 1888 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet Engine: Apache Tomcat/8.5.23 2017-11-19 20:20:39.693 INFO 1888 --- [ost-startStop-1] o.a.catalina.core.AprLifecycleListener : The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: [H:\TDDOWNLOAD\eclipse-jee-neon-3-win32-x86_64\eclipse\external\jdk\jdk1.8.0_40\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;D:/software/eclipse-v4.6.3/eclipse//external/jdk/jdk1.8.0_40/jre/bin/server;D:/software/eclipse-v4.6.3/eclipse//external/jdk/jdk1.8.0_40/jre/bin;D:/software/eclipse-v4.6.3/eclipse//external/jdk/jdk1.8.0_40/jre/lib/amd64;C:\ProgramData\Oracle\Java\javapath;C:\Program Files\ImageMagick-7.0.6-Q16;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\Program Files\TortoiseSVN\bin;C:\Program Files\Java\jdk1.8.0_102\bin;C:\Program Files\Java\jdk1.8.0_102;C:\Program Files\nodejs\;C:\Program Files\MySQL\MySQL Server 5.5\bin;C:\Users\xqlee\AppData\Local\Microsoft\WindowsApps;C:\Users\xqlee\AppData\Roaming\npm;D:\software\eclipse-v4.6.3\eclipse;;.] 2017-11-19 20:20:39.764 INFO 1888 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext 2017-11-19 20:20:39.764 INFO 1888 --- [ost-startStop-1] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 1232 ms 2017-11-19 20:20:39.864 INFO 1888 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean : Mapping servlet: 'dispatcherServlet' to [/] 2017-11-19 20:20:39.868 INFO 1888 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'characterEncodingFilter' to: [/*] 2017-11-19 20:20:39.868 INFO 1888 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'hiddenHttpMethodFilter' to: [/*] 2017-11-19 20:20:39.868 INFO 1888 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'httpPutFormContentFilter' to: [/*] 2017-11-19 20:20:39.868 INFO 1888 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'requestContextFilter' to: [/*] 2017-11-19 20:20:40.134 INFO 1888 --- [ main] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@419c5f1a: startup date [Sun Nov 19 20:20:38 CST 2017]; root of context hierarchy 2017-11-19 20:20:40.195 INFO 1888 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/arrParams.json],methods=[POST]}" onto public java.lang.Object net.xqlee.project.controller.TestController.arrParams(java.util.List<net.xqlee.project.pojo.Persion>) 2017-11-19 20:20:40.198 INFO 1888 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController.error(javax.servlet.http.HttpServletRequest) 2017-11-19 20:20:40.199 INFO 1888 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],produces=[text/html]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse) 2017-11-19 20:20:40.220 INFO 1888 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler] 2017-11-19 20:20:40.220 INFO 1888 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler] 2017-11-19 20:20:40.251 INFO 1888 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler] 2017-11-19 20:20:40.375 INFO 1888 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Registering beans for JMX exposure on startup 2017-11-19 20:20:40.435 INFO 1888 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) 2017-11-19 20:20:40.438 INFO 1888 --- [ main] n.x.p.DemoSpringbootPublicApplication : Started DemoSpringbootPublicApplication in 2.252 seconds (JVM running for 2.598) </code></pre> *可以看到spring boot项目已经在本地的8080端口启动 <h3>3.2通过postmain工具进行调用接口测试</h3> <img alt="调用spring web" class="img-thumbnail" src="/assist/images/blog/67408a8c86fd4cd08191aa40c4716d47.png" /><br /> 如上图所示,<br /> 1.选择传输参数的类型为raw<br /> 2.选择具体的参数类型为JSON<br /> 3.测试数据<br /> <br /> 点击postmain工具的发送请求按钮观察eclipse的控制台:<br /> <img alt="Java spring web接口调用图" class="img-thumbnail" src="/assist/images/blog/8e296a3612444d7fbf5f265122f66ce2.png" /><br /> 从上图中可以看到我们的集合参数已经成功接收。<br />