关于node.js:让nodejs开启服务更简单koa篇

在nodejs原始的http模块中,开启一个服务编码绝对麻烦,须要对申请形式及上传的数据进行各种判断,而koa给咱们提供了比拟便捷的编码方式,同时它还有很多中间件能够间接拿来应用。 首先来看,如何开启一个服务,装置koa,引入Koa构造函数,通过new来创立koa的实例对象,监听8000端口,通过use来解决客户端的申请,use解决的中间件有两个参数,ctx示意上下文,request和response都在ctx中,next示意执行下一个匹配的中间件。以下代码示意当申请形式为get时,响应后果hello world const Koa = require('koa')const app = new Koa()app.use((ctx, next)=>{  if(ctx.request.method === 'GET'){    ctx.response.body = 'hello world'  }})app.listen(8000, ()=>{ console.log('8000端口启动') }) koa自身比拟轻量,很多两头库都没有集成在koa外部,须要装置其余的库能力应用,首先罕用的就是 koa-router,router 能够自定义路由,可通过get / post 等办法间接调用 const Koa = require('koa')const app = new Koa()const Router = require('koa-router')const userRouter = new Router({ prefix: '/user' })app.use((ctx, next) => {  next()})userRouter.post('/', (ctx, next)=>{  ctx.response.body = 'post申请'})app.use(userRouter.routes())app.listen(8000, () => { console.log('8000端口启动') }) 在get、post或者其余申请中,通常会携带一些参数,而参数对于咱们接管申请返回响应也是十分重要的,get申请的参数通常有两种,分为query和params,query的形式是在url前面拼接问号和键值对的参数,相似于/user?name=kiki,params是在斜线前面增加参数,相似于 /user/1,这个数字1就是不固定的,能够由客户端传递的值,在koa-router中,都能够间接通过ctx.request对象中获取 const Koa = require('koa')const app = new Koa()const Router = require('koa-router')const userRouter = new Router({ prefix: '/user' })app.use((ctx, next) => {  next()})userRouter.get('/:id', (ctx, next)=>{   ctx.response.body = {      query: ctx.request.query,      params: ctx.request.params   }})app.use(userRouter.routes())app.listen(8000, () => { console.log('8000端口启动') }) ...

August 8, 2021 · 1 min · jiezi

关于node.js:Node-CPU-偶发100-排查小结

博文开始前,先贴下本文目录, 次要篇幅在第二局部:如何定位。 前言(背景)外部管理系统,Node.js我的项目线上运行始终稳固、失常, 某天开始应用人员反馈系统拜访卡顿,同时对应服务器呈现CPU 占用 95% ~ 120%过高的钉钉告警,超过100%是因为对应Linux服务器是多核, 呈现后1~5分钟后失常,偶发呈现,这次问题持续时间较长,参考、浏览了不少文章,写个博文记录、总结下。 问题呈现 ~ 解决工夫 2021.07.21 ~ 2021.08.01 先说下外部零碎技术架构,前端React, 后端NodeJS框架Egg.js(Koa2封装)。所以监控定位时有些 NodeJs 库不适宜接入,这个第二局部具体讲。 如何定位Node我的项目接入性能监控平台NodeJs我的项目呈现CPU占用100%以上时,登录对应服务器命令行 top -c 查看以后服务器哪个过程占用CPU最高! 对于偶发场景,不可能始终开着终端,且呈现问题了没有监控告警,无奈晓得呈现问题的具体工夫,不不便定位解决问题。 所以须要接入性能监控平台,具体可看 如何接入Node监控平台 - alinode , 咱们是外部服务器部署了aliNode,操作界面差不多。接入胜利后,呈现CPU过高时有以下图表: 当然也有其余 Node.js 插件能实现相似的监控,具体参考: NodeJs调试指南, 接入胜利后次要看两项: 火焰图 和 GC Trace(垃圾回收跟踪) 火焰图火焰图(Flame Graph)大家应该听过,它能够将 CPU 的应用状况可视化,使咱们直观地理解到程序的性能瓶颈。咱们通常要联合操作系统的性能剖析工具(profiling tracer)应用火焰图,常见的操作系统的性能剖析工具如下: Linux:perf, eBPF, SystemTap, and ktap。Solaris, illumos, FreeBSD:DTrace。Mac OS X:DTrace and Instruments。Windows:Xperf.exe。如果未接入NodeJs性能监控, 得在服务器(个别是Linux)装置以上剖析工具; 接入NodeJs性能监控后能一键导出 火焰图, 了解火焰图网上很多教程, 例如: 疾速定位NodeJs线上问题 - 之火焰图篇 实践上通过火焰图能具体定位到具体是哪一行代码导致CPU 过高。 然而,这边实际发现火焰图两问题: ...

August 8, 2021 · 4 min · jiezi

关于node.js:node设置跨域笔记源码

/* * @Author: yongyuan at <yongyuan253015@gmail.com> * @Date: 2021-08-05 22:48:27 * @LastEditTime: 2021-08-07 19:09:27 * @LastEditors: yongyuan at <yongyuan253015@gmail.com> * @Description: 我的项目主体js文件 * @FilePath: \nodeJS\app.js * */const express = require("express");const app = express();const arr = [ { id: 1, value: 8, done: false, delete: false }, { id: 2, value: 43, done: false, delete: false }, { id: 3, value: 3, done: false, delete: false }]app.all('*', (req, res, next) => { // 容许跨域,*示意容许任意域名跨域 res.header('Access-Control-Allow-Origin', "*"); res.header('Access-Control-Allow-Headers', "content-type"); res.header('Access-Control-Allow-Methods', "DELETE,PUT,POST,GET,OPTTONS"); next()})app.get("/todoList", (req, res) => { res.send(arr)});app.listen(3000, () => { console.log("服务启动了")})

August 8, 2021 · 1 min · jiezi

关于node.js:Node创建HTTP

最近开始学习node,想实现之前的打算,Node学习打算曾经被搁浅这么久了,明天就先学习怎么创立HTTP服务的吧: const http = require('http');// 创立HTTP服务const server = http.createServer((request, response) => { response.writeHead(200, { 'Content-Type': 'text/plain' }) response.end("hello worle!");});server.listen(8080);console.log("dvdfb")而后间接运行该文件就是开启HTTP的服务了:node index.js 在浏览器输出127.0.0.1:8080成果如下图: 还是先看看文档,再来写点笔记吧!

August 5, 2021 · 1 min · jiezi

关于node.js:手把手教你搭建自己的Raneto知识库二

作者:悠悠做神仙 起源:恒生LIGHT云社区 上一篇 手把手教你搭建本人的Raneto知识库(一)次要介绍Raneto的依赖环境装置(Node.js)、Node.js装置过程中遇到的一些问题、Raneto下载安装等,所以当初启动Raneto,曾经能够看到默认模板的内容了。 上面,给大家介绍一下,Raneto的应用以及做一些个性化的配置等。 1、目录构造切换到安装文件门路下,能够看到有以下文件: [root@yyzsx Raneto-0.16.5]# ll总用量 316drwxrwxr-x 7 root root 4096 1月 20 2019 appdrwxrwxr-x 2 root root 4096 1月 20 2019 bin-rw-rw-r-- 1 root root 659 1月 20 2019 CONTRIBUTE.md-rw-rw-r-- 1 root root 181 1月 20 2019 Dockerfiledrwxrwxr-x 3 root root 4096 1月 20 2019 example-rw-rw-r-- 1 root root 641 1月 20 2019 gulpfile.js-rw-rw-r-- 1 root root 8506 1月 20 2019 HISTORY.md-rw-rw-r-- 1 root root 1083 1月 20 2019 LICENSEdrwxrwxr-x 2 root root 4096 1月 20 2019 logo-rw-rw-r-- 1 root root 775 1月 20 2019 Makefile-rw-rw-r-- 1 root root 2439 1月 20 2019 package.json-rw-rw-r-- 1 root root 255479 1月 20 2019 package-lock.json-rw-rw-r-- 1 root root 1917 1月 20 2019 README.mddrwxrwxr-x 3 root root 4096 1月 20 2019 testdrwxrwxr-x 3 root root 4096 1月 20 2019 themes[root@yyzsx Raneto-0.16.5]#对于文件这里大体说一下,次要的几个文件夹和文件: ...

August 3, 2021 · 1 min · jiezi

关于node.js:手把手教你搭建Raneto知识库框架一

作者:悠悠做神仙 起源:恒生LIGHT云社区 需要背景:咱们一个小组,组长心愿搭建一个知识库框架,思考数据安全,同时不能太过简单,可疾速搭建起来并投入使用(因为没有丰盛的机器资源给咱们:daku:)。可见,最初这个工作还是交给我了。 技术选型:目前,已知一些比拟好的能够作为知识库的框架,给组长反馈,然而都被打回来了。比方: 语雀:尽管应用体验极佳,然而老大感觉数据不平安,毕竟是阿里的云知识库。石墨文档:理由也是平安角度,毕竟石墨文档也是云知识库。Confluence:10人以下收费,超过就要花钱,而且相对而言建设和部署比较复杂。腾讯文档等,理由就是从数据安全角度,以及资源保护来说,通通被pass掉。正当苦恼的时候,一个小而美的只是框架映入眼帘,没错就是接下来要的——Raneto。 话不多说,“翠花,上干货!” 1、初始RanetoRaneto官网:http://docs.raneto.com/ Raneto Git地址:https://github.com/gilbitron/Raneto/ (看这简洁大气的布局,i了i了) 官网介绍如下: Raneto 是Node.js的知识库平台,它应用动态 Markdown文件来反对知识库。 Raneto 能够称为“动态站点生成器”,因为它不须要数据库。您的所有内容都存储在 contentMarkdown ( .md) 文件中的文件夹中,整个知识库构造和内容由 Raneto 生成。这很好,因为它是: 简略: 您能够应用本人喜爱的文本编辑器创立和治理整个知识库Flat: Raneto 是一个“立体文件”CMS,意味着没有数据库问题,没有 MySQL 查问,什么都没有疾速: Raneto 十分轻量级,并且不应用数据库,因而速度十分快很想然,这个小东西十分合乎咱们的需要,反对markdown,同时无需部署数据库,也不必部署一些服务,基于Node.js,极其不便,上面咱们开始干活。 2、下载Node.js既然是基于Node.js,咱们就须要先装置Node.js。 首先,依据零碎,下载对应的Node.js。 Node.js官网:https://nodejs.org/en/download/ 然而,思考到官网链接有时候不太稳固,而且,个别官网都是最新版本,咱们自身可能用不到这么新的版本,别急,这里给大家筹备了一个以往版本的下载资源: https://nodejs.org/zh-cn/download/releases/ 小仙这里用的版本是Linux的V10.12.0版本。 3、装置Node.js首先依照把须要的Node.js下载下来。能够抉择官网下载,也能够用上文提到的在历史版本里,依据零碎抉择下载。上面以Linux的V10.12.0装置为例: [root@yyzsx /]# cd /usr/local/src/[root@yyzsx src]# wget http://nodejs.org/dist/v10.12.0/node-v10.12.0.tar.gz--2021-07-08 02:50:32-- http://nodejs.org/dist/v10.12.0/node-v10.12.0.tar.gz正在解析主机 nodejs.org (nodejs.org)... 104.20.23.46, 104.20.22.46, 2606:4700:10::6814:172e, ...正在连接 nodejs.org (nodejs.org)|104.20.23.46|:80... 已连贯。已收回 HTTP 申请,正在期待回应... 301 Moved Permanently地位:https://nodejs.org/dist/v10.12.0/node-v10.12.0.tar.gz [追随至新的 URL]--2021-07-08 02:51:36-- https://nodejs.org/dist/v10.12.0/node-v10.12.0.tar.gz正在连接 nodejs.org (nodejs.org)|104.20.23.46|:443... 已连贯。已收回 HTTP 申请,正在期待回应... 200 OK长度:36277157 (35M) [application/gzip]正在保留至: “node-v10.12.0.tar.gz”100%[==============================================================================================================================>] 36,277,157 733KB/s 用时 50s 2021-07-08 02:52:26 (715 KB/s) - 已保留 “node-v10.12.0.tar.gz” [36277157/36277157])#解压tar zxvf node-v0.10.24.tar.gz[root@yyzsx src]# tar zxvf node-v10.12.0.tar.gz#编译[root@yyzsx src]# cd node-v10.12.0[root@yyzsx node-v10.12.0]# ./configure --prefix=/usr/local/node/10.12.0[root@yyzsx node-v10.12.0]# make[root@yyzsx node-v10.12.0]# make install#环境变量vim /etc/profile[root@yyzsx node-v10.12.0]# vim /etc/profile#set for nodejsexport NODE_HOME=/usr/local/node/10.12.0export PATH=$NODE_HOME/bin:$PATH#:wq保留并退出,编译/etc/profile 使配置失效source /etc/profile[root@yyzsx node-v10.12.0]# source /etc/profile#验证:node -v[root@yyzsx node-v10.12.0]# node -vv10.12.0#npm模块地址/usr/local/node/0.10.24/lib/node_modules/编译下载的时候,可能会下载迟缓或者下载失败,能够参考下一部分内容【4、疑难解决--装置Node.js失败、npm下载迟缓等】。 ...

August 3, 2021 · 2 min · jiezi

关于node.js:让nodejs开启服务更简单express篇

上一篇文章说到,nodejs获取客户端申请须要咱们本人去解决申请参数、申请形式等,而在express框架外部集成了很多好用的办法,咱们不须要从0开始编写各种解决逻辑,这样能够极大进步咱们的开发效率~ 通过引入 express ,再执行express函数,生成的app对象通过中间件来进行各种操作。 const express = require('express')const app = express()app.post('/home', (req, res, next)=>{ res.end('hello express')})app.listen('8000', ()=>{}) app属性中有get/post/put/delete等等办法来接管不同申请形式的申请数据,这些办法都属于中间件,另外,它还有use办法能够接管所有类型的申请,并且express中的中间件是能够应用多个的,首先匹配第一个符合条件的中间件来解决申请并响应,如果须要执行多个中间件,可通过中间件回调函数中的第三个参数 next,来执行下一个可匹配的中间件。 const express = require('express')const app = express()app.use('/', (req, res, next)=>{ console.log('匹配到了use中间件') next()})app.post('/home', (req, res, next)=>{ console.log('匹配到了post中间件') res.end('hello express')})app.listen('8000', ()=>{ console.log('开启8000端口')}) 因为中间件的这个个性,就能够依据不同的申请类型来对立解决数据,罕用的申请形式和类型总共有5种,get申请中有两种,别离是 params 和 query 传参。params 传参的格局相似于 localhost:8000/goods/1,这个数字1就是动静传入的,query传参的格局相似于 localhost:8080/login?name=kiki,在问号前面应用键值对的模式拼接参数。 express的解决形式非常简单,通过回调函数中 req.params 和 req.query即可获取 app.get('/goods/:id', (req, res, next)=>{ console.log(req.url) console.log(req.params) res.end('params')})app.get('/login', (req, res, next)=>{ console.log(req.url) console.log(req.query) res.end('query')}) post申请中还有另外三种常见的申请类型,别离是 json、urlencoded和form-data。json字符串示意传递的数据是键值对的模式,格局如 { "name": "kiki", password: 666 },urlencode 格局如 name=kiki&password=666,而form-data就是表单提交的模式,通常用于文件上传。 ...

August 1, 2021 · 2 min · jiezi

关于node.js:Nodejs切图

我在juejin看到一篇文章百万PV商城实际系列 - 前端图片资源优化实战,的影响,通过代码实现切图装置# 建一个文件npm init # 装置两个依赖npm i image-size sharp 代码const sizeOf = require('image-size');const sharp = require('sharp');const currentImageInfo = sizeOf('./wallhaven-3zwvk3.jpg') // 加载一张图let clientHeight = currentImageInfo.heightconsole.log(currentImageInfo)const heights = []const SPLIT_HEIGHT = 200while (clientHeight > 0) { // 切图高度短缺时 if (clientHeight >= SPLIT_HEIGHT) { heights.push(SPLIT_HEIGHT) clientHeight -= SPLIT_HEIGHT } else { // 切割高度不够时,间接切成一张 heights.push(clientHeight) clientHeight = 0 }}console.log(heights)let top = 0heights.forEach((h, index) => { sharp('./wallhaven-3zwvk3.jpg') .extract({ left: 0, top: top, width: currentImageInfo.width, height: h }) .toFile(`./img/split_${index + 1}_block.jpg`, (err, info) => { if(!err){ onsole.log(`split_${index + 1}_block.jpg切割胜利`) }else{ console.log(JSON.stringify(err), 'error') } }) top += h})执行node index.js ...

August 1, 2021 · 1 min · jiezi

关于node.js:Mac-安装nodejsvuecli

装置node应用Homebrew装置# 查看node.js版本/本地是否装置node.jsnode -v# 指向homebrew装置node的目录brew link node# 卸载node.jsbrew uninstall node# 装置node.jsbrew install nodewhere node官网下载https://nodejs.org/zh-cn/down... npm镜像源设置为淘宝镜像npm全称Node Package Manager,是node.js的模块依赖管理工具。因为npm的源在国外,所以国内用户应用起来各种不不便。 npm config set registry https://registry.npm.taobao.org# 配置后可通过上面形式来验证是否胜利npm config get registry# 或npm info express装置vue-cli# 卸载旧版本vue-clinpm uninstall vue-cli -g# 装置sudo npm install -g @vue/cli# 查看是否装置胜利vue -Vn - node版本管理工具# 装置npm install -g n# 查看node所有版本npm view node versions# 查看以后装置的node.js版本n# 应用或装置最新的官网公布:n latest# 应用或装置稳固的官网公布:n stable# 应用或装置最新的LTS官网版本:n lts# 装置/激活版本# 只需执行n <version>即可装置node# 如果曾经装置,示意激活该版本。n 0.8.14n 6.9.1# 删除版本,删除一些版本:n rm 0.9.4 v0.10.0# 或者,您能够应用以下 - 代替rm:n - 0.9.4# 相干用法n --help

July 31, 2021 · 1 min · jiezi

关于node.js:Nodejs-应用的内存泄漏问题的检测方法

Debugging Memory Leaks in Node.js Applications Node.js 是一个基于 Chrome 的 V8 JavaScript 引擎构建的平台,用于轻松构建疾速且可扩大的网络应用程序。 Google 的 V8 ——Node.js 背地的 JavaScript 引擎, 它的性能令人难以置信,并且 Node.js 在许多用例中运行良好的起因有很多,但您总是受到堆大小的限度。 当您须要在 Node.js 应用程序中解决更多申请时,您有两种抉择:垂直扩大或者程度扩大。 程度扩大意味着您必须运行更多并发应用程序实例。 如果做得好,您最终可能满足更多申请。 垂直扩大意味着您必须进步应用程序的内存应用和性能或减少应用程序实例可用的资源。 Node.js Memory Leak Debugging ArsenalMEMWATCH如果您搜寻“如何在 node.js 中查找透露”,您可能会找到的第一个工具是 memwatch。 原来的包早就废除了,不再保护。 然而,您能够在 GitHub 的存储库分叉列表中轻松找到它的更新版本。 这个模块很有用,因为它能够在看到堆增长超过 5 次连续垃圾收集时收回透露事件。 HEAPDUMP很棒的工具,它容许 Node.js 开发人员拍摄堆快照并在当前应用 Chrome 开发人员工具查看它们。 NODE-INSPECTOR甚至是 heapdump 的更有用的代替计划,因为它容许您连贯到正在运行的应用程序,进行堆转储,甚至能够即时调试和从新编译它。 Taking “node-inspector” for a Spin可怜的是,您将无奈连贯到在 Heroku 上运行的生产应用程序,因为它不容许将信号发送到正在运行的过程。 然而,Heroku 并不是惟一的托管平台。 为了体验 node-inspector 的实际操作,咱们将应用 restify 编写一个简略的 Node.js 应用程序,并在其中搁置一些内存透露源。 这里所有的试验都是用 Node.js v0.12.7 进行的,它是针对 V8 v3.28.71.19 编译的。 ...

July 29, 2021 · 3 min · jiezi

关于node.js:strapi-之relation

strapi的关联关系。1,首先在治理页面,增加relation (援用)字段。抉择对应关系,是一对一还是一对多。2,当抉择关联关系为,一对多时,要以数组模式传输。project_forms 就是关联的字段,只有以数组模式寄存 关联对象 id 就好。 var tempObj = { cpName: '测03', project_forms: ['12']}2.1当关联关系抉择一对一的时候,conectList 为数字 id 就好,不必是数组,数组反而传不过来。 this.projectForm.conectList= null;let temp = this.gameFormList.filter(res => res.value === val)this.projectForm.conectList = temp[0].id;3,在进行表单保留的时候,对于关联关系的字段要 传id ,而不是对象,不然会报错; error error: update "project_lists" set "channel" = $1, "updated_at" = $2 where "channel" = $3 returning * - invalid input syntax for integer: "{"1"}"

July 23, 2021 · 1 min · jiezi

关于node.js:strapi安装

1,装置执行如下命令,进行装置。 yarn create strapi-app my-project --quickstart如果没有装置 yarnnpm install -g yarn如果仍旧报错:‘yarn’ 不是外部或外部命令,也不是可运行的程序将yarn 增加到零碎的环境变量外面。如果呈现:You need to install the latest version of Visual Studio gyp ERR! find VSgyp ERR! find VS **************************************************************gyp ERR! find VS You need to install the latest version of Visual Studiogyp ERR! find VS including the "Desktop development with C++" workload.gyp ERR! find VS For more information consult the documentation at:gyp ERR! find VS https://github.com/nodejs/node-gyp#on-windows以管理员身份关上cmd,执行命令 npm install reinstall -gnpm install -g windows-build-tools装置之后将从新执行 yarn create strapi-app my-project --quickstart ,在此之前要先将my-project 文件删除。 ...

July 23, 2021 · 1 min · jiezi

关于node.js:使用nodemailer在本地发送邮件

本文探索了如何利用nodemailer库在本地应用api的形式来发送电子邮件。 nodemailer官网装置npm install nodemailer -S根本实现// @doc https://nodemailer.com/const nodemailer = require("nodemailer");async function main() { let transporter = nodemailer.createTransport({ // 反对465和587,二者都能够 port: 587, secure: false, // true for 465, false for other ports // port: 465, // secure: true, // 服务起源:163邮箱 service: "163", auth: { user: "frost@163.com", // 邮箱SMTP受权码,很重要,相当于一般的邮箱明码 // @question https://note.youdao.com/ynoteshare1/index.html?id=f9fef46114fb922b45460f4f55d96853&type=note pass: "xxx", }, }); let info = await transporter.sendMail({ from: '"frost" <frost@163.com>', // sender address to: "xx@163.com,xxx@qq.com", // list of receivers subject: "Hello ✔", // Subject line html: "<b>Hello world2?</b>", // html body }); console.log("Message sent: %s", info.messageId);}main().catch(console.error);间接node index.js即可运行,去邮箱查看邮件吧。 ...

July 22, 2021 · 1 min · jiezi

关于node.js:node环境配置及问题

nrm装置出错https://blog.csdn.net/LQCV587... npm或cnpm装置-g出错若是因为没有权限 https://blog.csdn.net/weixin_39921821/article/details/105448827装置vue-cli出错npm cache clean --forcenpm i vue-cli -g 多装置几次终于胜利装置vue-cli

July 21, 2021 · 1 min · jiezi

关于node.js:bodyParser在node中被弃用解决办法

编译器中援用bodyParser。应用时bodyParser被编译器划上横线提醒已弃用(19年已弃用) // json申请app.use(bodyParser.json())// 表单申请app.use(bodyParser.urlencoded({extended: false}))解决办法(间接应用express代替bodyParser进行调用): // json申请app.use(express.json())// 表单申请app.use(express.urlencoded({extended: false}))

July 20, 2021 · 1 min · jiezi

关于node.js:如何在-Nodejs-项目中使用-Babel

公众号 明天解说如何在 Node.js 我的项目中应用 Babel。 后面《手把手教你如何配置Babel的系列》文章中咱们讲到,Babel会把新的语言个性降级解决,转换成指标环境反对的语法,并且对指标环境不反对的API增加Polyfill。文章中提到的指标环境,都是特指浏览器,那么Node环境如何应用呢? 接下里,咱们用Koa创立一个简略的服务器,而后一步一步的解说集成Babel。 创立一个node我的项目首先,创立一个node我的项目的文件夹,并进入 mkdir babel-node-example cd babel-node-example初始化我的项目 npm init咱们应用Koa创立一个简略的服务,咱们须要装置Koa依赖 npm install koa --save装置结束之后,创立一个src文件夹,进入src文件夹,增加index.js文件 mkdir src && cd "$_" && touch index.js通过require形式导入了Koa,创立一个简略的Koa服务 //这里咱们通过require形式导入了Koaconst Koa = require('koa')import Koa from "koa"const app = new Koa()// 端口const PORT = 3000app.use(async (ctx, next) => { ctx.body = { code: 0, message: "success", data: {} } next()})app.listen(PORT, () => { console.log(`Server is listening ${PORT},http://localhost:${PORT}`)})在package.json的script外面增加如下命令 { "start": "node ./src/index.js" }而后在我的项目根目录上面执行 npm run start ...

July 19, 2021 · 1 min · jiezi

关于node.js:全栈岗位面试算法题-数字输入框校验

起因最近面试web全栈开发工程师岗位,接触到一个算法题,感觉很考验剖析能力并且在理论中是有肯定作用的算法,因而分享进去跟大家探讨。 题目依据经营需要,你要为咱们的数值公布零碎减少一项数字输入框校验性能。咱们通常会对一些数字输出进行大小限度。 比方要求输出的值必须在300 - 347之间(包含300和347)。聪慧的你发现,有时你能够不用等用户输出完就晓得他的输出是否非法的了。 比方,下面这种状况,当用户输出37时,必定他的输出就是非法的了。 当初你须要用程序来做这件事。 输出: 第一行为输入框的下界 第二行为输入框的上界 第三行为一些用逗号宰割的整数,这些整数作为用户输出的数字 输入: 仅有一行,为一些用逗号宰割的字符串。 每个字符串对应一个用户输出的数字,如果用户输出为非法则输入INVALID,否则输入VALID 输出束缚 上下界均位于[1, 2000000000]之间,且下界小于等于上界,第三行的数字个数位于[1, 50]之间,且每个数字也位于[1, 2000000000]之间 举例1: 输出 300 347 37 输入 INVALID 举例2: 输出 310 320 3,31,317,3174,310,320 输入 VALID,VALID,VALID,INVALID,VALID,VALID 解释:前3个是输出317时的程序输出,所以都是非法的。最初2个时上界和下界,也是非法的 题目剖析输出大于下限间接返回INVALID输出在上限和下限之间,间接返回VALID只有输出小于上限的状况,才会产生校验,因而代码重点在于这一步 下限和上限数字位数相差1位以上,比方上限31是两位数, 下限7001是四位数,因为输出是小于上限31的,又因为上上限两头能够蕴含全副的三位数字,三位数字都是符合条件的,因而间接返回VALID下限和上限数字位数相等的状况,只须要把上上限数字缩短到和输出数字一样的长度(从左边去除),这时输出必须在缩短后的上上限之间,能力返回VALID,否则你在输出之后无论怎么补充数字都无奈保障在上上限之间。下限和上限数字位数正好相差1位的状况 上限首位小于下限首位,比方上限50,下限618,又因为输出小于50,因而你在输出前面轻易加一位都大于50小于618,间接返回VALID上限首位大于等于下限首位,同样把上上限数字缩短到和输出数字一样的长度(从左边去除),这时候你必须保障输出大于等于缩短后的上限,或者小于等于缩短后的下限(此时缩短后的上限 > 缩短后的下限),能力返回VALID,否则你在输出后再次增加任何数字都是不非法的其余状况,一律返回INVALID代码实现const readline = require('readline');const rl = readline.createInterface(process.stdin, process.stdout);let min = 0;let minLen = 0;let max = 0;let maxLen = 0;let strArr = null;let outputArr = [];let index = 0;rl.on('line', function(line) { if (index === 0) { min = parseInt(line); if (min < 1 || min > 12000000000) { console.log('输出有误!'); rl.close(); } minLen = line.length; } if (index === 1) { max = parseInt(line); if (max < 1 || max > 12000000000) { console.log('输出有误!'); rl.close(); } if (min > max){ console.log('上界不能小于下界!'); rl.close(); } maxLen = line.length; } if (index === 2) { strArr = line.split(','); const len = strArr.length; if (len < 1 || len > 50) { console.log('输出有误!'); rl.close(); } for (const str of strArr) { const num = parseInt(str); if (num < 1 || num > 12000000000) { console.log('输出有误!'); rl.close(); } // 大于下限间接返回INVALID if (num > max) { outputArr.push('INVALID'); continue; } // 大于等于上限且小于等于下限间接返回VALID if (num <= max && num >= min) { outputArr.push('VALID'); continue; } // 小于上限的状况 // 上上限位数相差1以上,间接返回VALID if (maxLen - minLen > 1) { outputArr.push('VALID'); continue; } // 上上限位数相等的状况,即maxLen = minLen; const len = str.length; const offsetMin = String(min).slice(0, len); const offsetMax = String(max).slice(0, len); if (maxLen === minLen && str >= offsetMin && str <= offsetMax) { outputArr.push('VALID'); continue; } // 上上限位数相差1位的状况 if (maxLen - minLen === 1) { // 上限首位小于下限首位 if (String(min)[0] < String(max)[0]) { outputArr.push('VALID'); continue; } // 上限首位大于等于下限首位 if (str >= offsetMin || str <= offsetMax ){ outputArr.push('VALID'); continue; } } // 其余状况 outputArr.push('INVALID'); } console.log(outputArr.join(',')); rl.close(); } index++;}).on('close',function(){ // It's important to exit, otherwise the execution will time out process.exit(0);});总结此代码跑通了测试端全副测试用例并且没有超出响应工夫限度,各位同学能够做个参考,也欢送有其余更好思路的敌人留言分享。 ...

July 13, 2021 · 2 min · jiezi

关于node.js:Node-系列-007-nodexlsx

——————————☆☆☆—————————— Node 系列相应地址: 代码仓库:https://github.com/LiangJunro...文章仓库:https://github.com/LiangJunro...系列-前端材料/Node——————————☆☆☆—————————— 在通过 Puppeteer 操作浏览器下载到 Excel 之后,咱们终于能够将准备将多语言的操作玩出花来了。 本篇咱们将通过 node-xlsx,对 Excel 进行多语言导入导出的操作。 一 前言在服务端的工作中,生成报表并送给经营、产品进行剖析应该是一门简略手艺。 然而在前端中,能这样耍的机会并不多,所以多语言操作是个好玩的点(没接触过的会感觉比拟陈腐)。 当然,既然服务端能够,对 Node.js 来说,提供这种性能也无可非议。 jsliang 十分懒,所以直奔主题关上 GitHub: 那就第 1 个了,不要搞什么调研不调研的,对于非生产数据来说,我就是玩~ 看第一行简介:Excel file parser/builder that relies on js-xlsx. js-xlsx?这个我晓得啊,在 2021.06.03 这一刻有 25.7k Star 的仓库地址:https://github.com/SheetJS/sheetjs 其实一开始试了下它对于 Node 的,enm...一时半会没入门!然而,我还是用我的 node-xlsx 吧,毕竟例子都在它仓库的 README.md 贴出来了! 二 疾速开始安装包:npm i node-xlsx -S装置 TypeScript:npm i @types/node-xlsx -D2.1 测试导入src/index.tsimport program from 'commander';import common from './common';import './base/console';import xlsx from 'node-xlsx';import fs from 'fs';program .version('0.0.1') .description('工具库')program .command('jsliang') .description('jsliang 帮忙指令') .action(() => { common(); });program .command('test') .description('测试频道') .action(async () => { // 测试新性能的时候应用 // 以 buffer 模式导入 const workSheetsFromBuffer = xlsx.parse(fs.readFileSync(`${__dirname}/common/dist/Excel 试用文件.xlsx`)); console.log(JSON.stringify(workSheetsFromBuffer, null, 2)); // 以文件模式导入 const workSheetsFromFile = xlsx.parse(`${__dirname}/common/dist/Excel 试用文件.xlsx`); console.log(JSON.stringify(workSheetsFromFile, null, 2)); });program.parse(process.argv);执行 npm run test,控制台打印如下: ...

July 13, 2021 · 6 min · jiezi

关于node.js:Node聊天室和socketio原理与功能总结

导语:前几天做了一个繁难的聊天室,实现了聊天性能,聊天内容能够发送文本,图片,音频,视频,表情包等内容,反对一对一聊天,群组聊天。当初就之前的聊天室性能做一个简略的梳理和总结。目录原理简述性能开发成果体验原理简述这次应用了socket.io这个工具包进行通信。 webscokethtml5中有websocket的性能,参考这篇文章《html常识总结之WebSocket》理解更多基础知识。 WebSocket是一种在单个 TCP 连贯上进行全双工通信的协定, 能更好的节俭服务器资源和带宽,并且可能更实时地进行通信。 课外科普: 通信分类分为并行通信,串行通信,同步/异步,单工/双工,半双工/全双工。 并行通信指的是数据的各位同时在多根数据线上发送或接管。管制简略,传输速度快;因为传输线较多,实用于短距离通信。串行通信是指数据的各位在同一根数据线上逐位发送和接管。管制简单,传输速度慢;只须要一根数据线,实用于远距离通信。 依据对数据流的分界、定时以及同步计划办法不同,可分为和同步串行通信形式和异步通信形式。依据串行数据的传输方向,咱们能够将通信分为单工,半双工,双工。 单工:是指数据传输仅能沿一个方向,不能实现反向传输。半双工:是指数据传输能够沿两个方向,但须要分时进行传输。全双工:是指数据能够同时进行双向传输。socket.iosocket.io是基于websocket协定的一套成熟的解决方案。长处是性能好,反对多平台;毛病是传输的数据并不齐全遵循websocket协定, 这就要求客户端和服务端都必须应用socket.io的解决方案。 区别http和webscoket都是基于tcp;http建设的是短连贯;websocket建设的是长连贯;性能开发当初就这个性能进行剖析并且开发前端和后端内容,先来买通后端局部,为前端连贯socket服务作筹备。 上面这个展现的是最根底的聊天室,包含以下几个性能: 多人聊天显示用户名和人数回车发送到顶部后端方面这里就是如何在node中建设socket服务器。 装置依赖包npm install -g express-generatorexpress --view=ejs chatcd chatnpm installnpm install socket.io配置socket.io关上bin/www文件,在var server = http.createServer(app);上面一行写入以下内容。 上面内容就离开介绍各个内容,不做全副代码粘贴。 引入ws服务const ws = require('socket.io');const io = ws(server, { path: '/chat', transports: [ 'polling', 'websocket' ]})罕用办法连贯和断开连接io.on('connection', socket => { console.log('a user connected!'); //disconnect socket.on('disconnect', () => { console.log('a user disconnected!'); })}退出和来到房间// join roomsocket.join(roomId);// leave roomsocket.leave(roomId);承受音讯socket.on('event name', data => { // data}发送音讯socket.emit('event name', { // some data});向其他人播送socket.broadcast.emit('event name', { // some data});向某个房间发送音讯io.to(roomId).emit('event name', { // some data})简易程序let roomInfo = {};io.on('connection', socket => { let roomId = socket.handshake.query.roomId; // user login socket.on('login', data => { socket.join(roomId); if (!(roomId in roomInfo)) { roomInfo[roomId] = []; } let names = []; let users = roomInfo[roomId]; if (users.length) { for (let i = 0; i < users.length; i++) { names.push(users[i].name); } if (!(names.includes(data.user))) { users.push({ id: socket.id, name: data.name, avatar: data.avatar }) } } else { roomInfo[roomId].push({ id: socket.id, name: data.name, avatar: data.avatar }); } console.log('roomInfo: ', roomInfo); io.to(roomId).emit('system', { name: data.name, users: roomInfo[roomId] }) }) // client msg socket.on('message', data => { io.to(roomId).emit('chat', data); }) // leave room socket.on('leave', data => { let users = roomInfo[roomId]; if (users && users.length) { for (let i = 0; i < users.length; i++) { const user = users[i]; if (data.name == user.name) { users.splice(i, 1); } } } socket.leave(roomId); io.to(roomId).emit('logout', { name: data.name, users: roomInfo[roomId] }) console.log('roomInfo: ', roomInfo); }) socket.on('disconnect', () => { console.log('a user disconnect!'); })});前端方面引入socket.io.js文件<script src="./js/socket.io.js"></script>html局部登录界面: ...

July 9, 2021 · 5 min · jiezi

关于node.js:Node加解密原理和功能探索总结

导语:随着网络的飞速发展,网络安全问题也越来越重大。明天说一下在node中进行加密和解密的办法实现,次要是明码生成,明码加密传输,文本加密三种类型。目录名词解释办法实现实战演练名词解释上面就文中波及到的各个加密办法进行概念解释。 AES,密码学中的高级加密规范(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采纳的一种区块加密规范。MD5,信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被宽泛应用的明码散列函数,能够产生出一个128位(16字节)的散列值(hash value),用于确保信息传输残缺统一。MD5由美国明码学家罗纳德·李维斯特(Ronald Linn Rivest)设计,于1992年公开;Base64, 网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来示意二进制数据的办法。SHA256,平安散列算法SHA系列算法之一,其摘要长度为256bits,即32个字节,故称SHA256。对于任意长度(按bit计算)的音讯,SHA256都会产生一个32个字节长度数据,称作音讯摘要。当接管到音讯的时候,这个音讯摘要能够用来验证数据是否产生扭转,即验证其完整性。感兴趣的能够看下以下几篇文章具体理解下内容: 《AES加密算法的具体介绍与实现》《MD5算法详解》《Base64笔记》《一文读懂SHA256算法原理及其实现》办法实现文本加解密这里次要是应用crypto-js库进行实现的。依据这个库给出的办法,能够很轻松的对信息进行加密和解密,上面就间接写个办法吧。 目前比拟高级的加密算法是AES,上面的就是应用的这个算法。 装置npm install crypto-js引入文件const CryptoJS = require('crypto-js');设置iv和keyconst key = CryptoJS.enc.Utf8.parse('1c0c492f3c95b700');const iv = CryptoJS.enc.Utf8.parse('1160837067ec4700');文本加密// 加密function Encrypto(pwd) { let srcs = CryptoJS.enc.Utf8.parse(pwd); let encrypto = CryptoJS.AES.encrypt(srcs, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }); return encrypto.ciphertext.toString().toUpperCase();}文本解密// 解密function Decrypto(pwd) { let encryptHexStr = CryptoJS.enc.Hex.parse(pwd); let srcs = CryptoJS.enc.Base64.stringify(encryptHexStr); let decrypto = CryptoJS.AES.decrypt(srcs, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }); let decryptoStr = decrypto.toString(CryptoJS.enc.Utf8); return decryptoStr.toString();}明码加密有时候前端向后端传输用户信息,不能是明文传输,容易透露用户信息隐衷,所以就要加密传输,这里给出一种加盐算法,我采取的是sha256(Base64(md5(str)))的形式。 ...

July 9, 2021 · 2 min · jiezi

关于node.js:2019S1-QBUS6840

2019S1 QBUS6840 Assignment 1 Page 1 of 5QBUS6840 Assignment 1 – Homework:Due dates: Friday 12 April 2019Value: 15%RationaleThis assignment has been designed to help students to develop basic predictive analyticsskills on synthetic and possible real applied problems, including data visualization, modelbuilding and analysis in terms of understanding in theory, practices with raw data andprogramming in Python.Tasks Consider the (odd order) centred MA-(2+ 1) (i.e. CMA-(2 + 1)) and the two layer(2m+1)x(2n+1)-MA.(a) Show that a 3x5-MA is equivalent to a 7-term weighted moving average and find outall the weights. For general nonnegative integers m and n, argue that a(2m+1)x(2n+1)-MA is equivalent to a X-term weighted moving average. What is X?(b) Write out the formula for the CMA-(2 + 1), and use your general formula to writeout the formula for CMA-11.(c) Prove that when the given time series is periodic with the period 2+ 1, thesmoothed time series by the CMA-(2 + 1) is a constant series. Find out thevalue of that constant.(d) Again assume that the time series is periodic with the period 2???? + 1. Its firstorder difference time series is defined as.Prove that the new time series is also periodic with the period M, and identifythe smallest value for M.Apply CMA-(M) to and find out the resulting smoothed time series You must clearly show each step of reasoning. ...

July 8, 2021 · 7 min · jiezi

关于node.js:Nodejs-mysql-事务和锁的写法

一、装置相干包npm install access-db npm install dotenv而后在我的项目入口文件(如app.js)的最后面引入require('dotenv').config() 新建.env文件,并增加mysql配置。 MYSQL_HOST=localhost // 必填 MYSQL_USER=root MYSQL_PASSWORD=123456 MYSQL_PORT=3306 MYSQL_DATABASE= // 必填 数据库名二、事务和锁 transaction()事务处理的异步函数 let { run, begin, rollback, commit, locks } = await mysql.transaction()参数类型必填阐明beginFunction是事务开始函数commitFunction是事务提交函数rollbackFunction否回滚事务函数runFunction是执行sql语句函数locksObject否上锁类型locks详情 fieldvalue阐明shared_locks' lock in share mode'共享锁 Shared Locks (简称 S 锁,属于行锁)exclusive_locks' for update'排他锁 Exclusive Locks(简称 X 锁,属于行锁)begin()为事务开启函数,在begin()函数外面执行数据库操作,通过run()来执行各个sql语句,并返回后果。当执行报错,或执行的sql后果不满足条件时,能够用rollback()函数进行回滚操作。当执行没问题时,记得提交事务,即执行commit()函数。 如果须要相似秒杀流动那种业务。那么,还须要对数据进行加锁,间接在返回sql语句前面,加上locks对应的类型即可。 示例代码: import {mysql} from 'access-db'/** mysql 的事务 和 锁 */let {run, begin, rollback, commit, locks} = await mysql.transaction()await begin(async () => { try{ // 须要加锁的时候,就间接在返回的sql语句前面加上相应的锁,留神要将await括起来 let sql1 = (await mysql.get('user', 10, 'sentence')) + locks.exclusive_locks let sql2 = await mysql.update('user', 10, {money: ['incr', -3]}, 'sentence') let sql3 = await mysql.update('user', 12, {money: ['incr', 3]}, 'sentence') let res1 = await run(sql1) if(res1.data.money < 3){ return await rollback() //回滚事务 } await run(sql2) await run(sql3) await commit() //提交事务 }catch(err){ await rollback() //回滚事务 throw new Error(err) }})

July 8, 2021 · 1 min · jiezi

关于node.js:Node中文件断点续传原理和方法总结

导语:之前做过一个小我的项目,其中用到了文件上传,在大文件下面应用了断点续传,升高了服务器方面的压力,当初就这个开发教训做一个粗疏的总结。目录原理介绍办法总结实战演练原理介绍这里先介绍一下文件上传的原理,帮忙理清这个脉络。 一般上传个别网站上都是一般上传的比拟多,大多数都是上传一些用户的头像,用户的动静评论附带图片什么的,所以先来说一下这个的原理。 用户抉择文件后,js检测文件大小是否超出限度和格局是否正确;查看后应用ajax提交申请,服务端也进行二次验证后贮存到服务器;后端返回文件地址到前端,渲染页面数据;大文件上传用户抉择文件后,js检测文件大小是否超出限度和格局是否正确;依据文件大小,应用file.slice办法进行文件宰割;应用SparkMD5和FileReaderAPI生成文件惟一的md5值;应用ajax提交申请,服务端收到后返回文件在服务器的信息; 如果存在这个md5值的文件夹,则返回文件夹外面上传了多少文件;不存在则新建一个这个md5值的文件夹,返回空内容;前端收到信息后,依据返回信息作出判断; 如果返回的文件长度等于切片的总长度,则申请合并文件;如果返回的文件长度小于切片的总长度,则开始上传对应的切片文件,直至上传完最初一个切片再申请合并文件;后端收到合并的申请后,对对应的md5值的文件夹外面的文件进行合并,返回文件地址;前端收到文件地址后,渲染页面数据;断点续传这个的意思就是文件上传过程中,如果遇到不可抗力,比方网络中断,服务器异样,或者其余起因导致上传中断; 下次再次上传时候,服务端依据这个文件的md5值找出上传了多少,还剩下多少未上传,发送给客户端,客户端收到后持续对未上传的进行上传,上传实现后合并文件并返回地址。 这样就防止了文件反复上传,节约服务器空间应用,节约服务器资源,而且速度比上传一个大文件更快,更高效。 办法总结接下来依据下面的逻辑原理剖析步骤,进行代码性能实现。 一般文件本大节讲述一般文件的上传,包含前端局部和后端局部。 前端局部html局部先来建设个小房子 <div class="upload"> <h3>一般上传</h3> <form> <div class="upload-file"> <label for="file">请抉择文件</label> <input type="file" name="file" id="file" accept="image/*"> </div> <div class="upload-progress"> 以后进度: <p> <span style="width: 0;" id="current"></span> </p> </div> <div class="upload-link"> 文件地址:<a id="links" href="javascript:void();" target="_blank">文件链接</a> </div> </form> </div> <div class="upload"> <h3>大文件上传</h3> <form> <div class="upload-file"> <label for="file">请抉择文件</label> <input type="file" name="file" id="big-file" accept="application/*"> </div> <div class="upload-progress"> 以后进度: <p> <span style="width: 0;" id="big-current"></span> </p> </div> <div class="upload-link"> 文件地址:<a id="big-links" href="" target="_blank">文件链接</a> </div> </form> </div>引入axios和spark-md5两个js文件。 <script src="https://cdn.bootcdn.net/ajax/libs/axios/0.21.1/axios.min.js"></script><script src="https://cdn.bootcdn.net/ajax/libs/spark-md5/3.0.0/spark-md5.min.js"></script>css局部来装璜一下这个房子。 body { margin: 0; font-size: 16px; background: #f8f8f8;}h1,h2,h3,h4,h5,h6,p { margin: 0;}/* * { outline: 1px solid pink;} */.upload { box-sizing: border-box; margin: 30px auto; padding: 15px 20px; width: 500px; height: auto; border-radius: 15px; background: #fff;}.upload h3 { font-size: 20px; line-height: 2; text-align: center;}.upload .upload-file { position: relative; margin: 30px auto;}.upload .upload-file label { display: flex; justify-content: center; align-items: center; width: 100%; height: 150px; border: 1px dashed #ccc;}.upload .upload-file input { position: absolute; top: 0; left: 0; width: 100%; height: 100%; opacity: 0;}.upload-progress { display: flex; align-items: center;}.upload-progress p { position: relative; display: inline-block; flex: 1; height: 15px; border-radius: 10px; background: #ccc; overflow: hidden;}.upload-progress p span { position: absolute; left: 0; top: 0; width: 0; height: 100%; background: linear-gradient(to right bottom, rgb(163, 76, 76), rgb(231, 73, 52)); transition: all .4s;}.upload-link { margin: 30px auto;}.upload-link a { text-decoration: none; color: rgb(6, 102, 192);}@media all and (max-width: 768px) { .upload { width: 300px; }}js局部最初加上互动成果。 ...

July 7, 2021 · 6 min · jiezi

关于node.js:记一次-Nodejs-http-服务的排障记录

前言最近咱们团队接手了一个遗留我的项目,是由 Node.js 语言所编写的 HTTP 服务项目,我的项目大抵逻辑是通过 Node.js 来实现一层代理逻辑,做流量的直达,并增加一些要害的埋点来展现申请记录(_以及一些进阶的用法,篡改申请相干的数据,但与本次排障无关,便不赘述_)。刚接手的时候咱们失去的状况是,这个我的项目因为内存透露和其余未知的起因,导致我的项目毕竟定时进行重启,否则用户应用时会感触到显著的提早 or 服务间接不可用。 所以咱们在一边进行人肉运维的同时,开始浏览源码,理解我的项目,剖析问题的起因并尝试进行修复。 排查过程该我的项目是有要害的指标埋点的,包含内存、CPU等指标,以及用户流量的数据统计,咱们看到了两个比拟重要的指标: 内存趋势Active Handle 的数量 就像最后失去的信息一样,有内存透露的问题存在,而不到一个小时的指标断崖式上涨就是因为服务被重启导致的。 同样下边一个 Active Handle 指标也是稳定十分的大,这里能够简略介绍一下 Active Handle 是什么,这个会延长提到一个 Node.js 技术栈常常波及到的一个关键词: Event Loop。 简略介绍 Event Loop简略解释一下 Event Loop 的工作模式,如果咱们有一个文件,写了这样的代码: console.log('hello')那么咱们通过 node XXX 的形式运行该文件,运行结束后过程就会退出了。 而如果咱们写一个这样的文件: console.log('hello')setInterval(() => {}, 1e3)再次通过 node XXX 的形式运行该文件,则终端会始终停留在该过程,并不会退出,因为咱们创立了一个定时器,而定时器能够了解为是一个 Active Handle,而 Event Loop 的运行流程就是会执行所有的同步代码,而后检测是否存在 Active Handle,如果没有检测到则会间接退出,如有存在的 Handle 则会进入咱们相熟的 Event Loop。 咱们能够通过一个非公开的 API 来获取到 Active Handle 的数量: process._getActiveHandles()console.log(process._getActiveHandles().length) // 0如果通过 node XXX 的形式运行这样的代码,那么咱们会失去一个 0,而如果咱们间接通过 node 进入交互命令行,则会发现这个值为 2,这是因为交互式命令行会绑定 stdin 与 stdout,这也是为什么你会停留在交互式命令行环境,而非终端。 ...

July 6, 2021 · 3 min · jiezi

关于node.js:ORACLE-SQL执行计划

--explain查看SQL执行打算 EXPLAIN PLAN FOR select count(*) from steven.AWEN_OGG_TEST; select * from table(dbms_xplan.display()); --查看AWR和CURSOR中的执行打算 select * from table(dbms_xplan.display_awr('&sqlid')); select * from table(dbms_xplan.display_cursor('&sqlid')); --查看游戏代理中内存中的执行打算 select '| Operation |Object Name | Rows | Bytes| Cost |' as "Explain Plan in library cache:" from dual union all select rpad('| '||substr(lpad(' ',1*(depth-1))||operation|| decode(options, null,'',' '||options), 1, 35), 36, ' ')||'|'|| rpad(decode(id, 0, '----------------------------', substr(decode(substr(object_name, 1, 7), 'SYS_LE_', null, object_name) ||' ',1, 30)), 31, ' ')||'|'|| lpad(decode(cardinality,null,' ', ...

July 6, 2021 · 1 min · jiezi

关于node.js:上手Cocnvim-完全指南

上手Coc.nvim 齐全指南介绍Coc.nvim 是一个基于NodeJS 的实用于Vim8, Neovim 的Vim 智能补全插件。领有残缺的LSP 反对。配置、应用形式及插件零碎的整体格调相似 VSCode. 对于我本人来说,抉择它的起因就是它安装简单,功可能用。相比YouCompleteMe 而言装置过程几乎太难受了。 更多的信息能够参见Wiki. 另:因为Coc 自身是Vim 的一个插件而已,但它又有本人的插件零碎,所以上面我会将Coc 的插件叫做子插件以作辨别。 装置前提因为Coc.nvim 是基于NodeJS 的,所以如果机器上没有NodeJS 须要先装置NodeJS. Vundle增加上面的内容到.vimrc: Plugin 'neoclide/coc.nvim'在Vim 外面运行以下命令: :source %:PluginInstallVundle 版本低于0.10.2 的将Plugin 替换成Bundle. NeoBundle增加上面的内容到.vimrc: NeoBundle 'neoclide/coc.nvim'在Vim 外面运行以下命令: :source %:NeoBundleInstallVimPlug增加上面的内容到.vimrc: Plug 'neoclide/coc.nvim'在Vim 外面运行以下命令: :source %:PlugInstallPathogen切换到Pathogen 目录下并拉对应仓库即可: cd ~/.vim/bundlegit clone https://github.com/neoclide/coc.nvim增加插件因为Coc 自身并不提供具体语言的补全性能,更多的只是提供了一个补全性能的平台,所以在装置实现后,咱们须要装置具体的语言服务以反对对应的补全性能。关上Vim 并应用以下命令即可主动装置子插件及相干依赖。 :CocInstall coc-json coc-tsserver其中coc-json coc-tsserver 这些是对应的反对JSON, Typescript 的相干子插件。要检索都有哪些子插件能够间接在Npm 上查找coc.nvim, 亦或者应用coc-marketplace 间接在Vim 外面进行治理,装置命令如下: :CocInstall coc-marketplace装置完后用上面命令能够关上面板,Tab 可对高亮的子插件进行装置卸载等操作。 # 关上面板:CocList marketplace# 搜寻python 相干子插件:CocList marketplace python ...

July 5, 2021 · 1 min · jiezi

关于node.js:node服务端get访问接口实现与访问

后面解决了post提交的问题,咱们晓得Post接口该怎么实现了。那么当初咱们来看get申请接口该怎么实现,以及接口的拜访,在routers文件夹下创立index.js文件 首先看看首页获取数据加载的接口(index.js)的实现。代码如下: const express=require('express'); const pool=require('../pool'); const router=express.Router(); router.get('/',(req,res)=>{ //不带参数的数据加载接口 var sql=`select * from 数据库数据表名` pool.query(sql,(err,result)=>{ if(err) throw err res.send(result) }) }) module.exports=pool //浏览器输出http://127.0.0.1:3000/index //即可在浏览器看到服务端index接口返回的数据上面咱们把这个路由加载到app.js外面,并注册;咱们返回app文件夹下,找到app.js文件,关上,进行批改。代码如下: const express=require('express');var app=express();app.listen(3000);app.use(express.json());app.use(express.urlencoded({extended:true}));const login=require('./routers/login');const index=require('./router/index')console.log("服务器启动胜利")app.use('/login',login);app.use('/index',index)当初咱们曾经实现了不带参数的GET申请接口,上面咱们在index.js下增加一个带参数的indexa接口。咱们关上routers文件夹下的index.js文件,批改如下: const express=require('express'); const pool=require('../pool'); const router=express.Router(); router.get('/',(req,res)=>{ //不带参数的数据加载接口 var sql=`select * from 数据库数据表名` pool.query(sql,(err,result)=>{ if(err) throw err res.send(result) }) }) //浏览器输出http://127.0.0.1:3000/index //即可在浏览器看到服务端index接口返回的数据 router.get('/indexa',(req,res)=>{ var id=req.query.id //获取客户端get申请传过来的参数 var sql=`select * from 数据库数据表名 where id=?` sql.query(sql,[id],(err,result)=>{ res.send(result) }) }) module.exports=pool //浏览器输出http://127.0.0.1:3000/index/indexa?id=1好了,曾经实现了post接口和get接口的实现。基本上能够实现数据交互性能,但要害是须要设置好mysql数据库名和表名,以及各表里的内容。这样通过拜访数据接口,才不会呈现谬误! ...

July 5, 2021 · 1 min · jiezi

关于node.js:CabloyJS-基于-EggJS-实现的模块编译与发布

背景当初,EggJS被许多开发团队所采纳。有的团队基于商业知识产权的考量,往往会提一个问题:是否能够把EggJS当中的代码编译打包,而后再把代码美化? 模块编译的机制EggJS为何不能便当的实现编译的个性?在EggJS中,代码文件都是通过约定代码地位的形式组织并加载的。也就是说,代码文件都搁置在约定的目录构造当中,EggJS在启动零碎时,在约定的地位扫描加载约定的代码文件。因而,在这种机制下,不能便当的实现编译个性 CabloyJS是如何实现编译个性的?EggJS作为企业级框架提供了足够灵便的机制,比方,容许下层框架提供自定义的加载器。CabloyJS就是基于EggJS的这种机制实现了一套自定义的加载器 在CabloyJS中,模块当中的代码文件都是通过require的形式显式组织并加载的。这种加载机制为模块外部的源码文件提供了清晰的调用依赖关系,因而咱们就能够采纳Webpack实现编译打包,以及美化代码的工作 模块编译的意义模块复用、构建生态:模块可独自编译,从而能够独自公布、独自部署,独自降级,从而促成CabloyJS整个生态圈的凋敝,进一步减速理论业务的开发知识产权:模块可独自编译,也能够满足爱护商业代码的需要如何编译模块# 进入模块所在目录$ cd /path/to/module# 编译模块前端代码$ npm run build:front# 编译模块后端代码$ npm run build:backend编译参数所有模块均采纳缺省的编译参数,当然也能够提供自定义的编译参数,以模块test-party为例: src/module/test-party/build/config.js module.exports = { front: { productionSourceMap: false, uglify: true, }, backend: { productionSourceMap: false, uglify: true, },};名称阐明productionSourceMap是否生成SourceMap文件uglify是否uglify代码模块加载约定在模块目录下,既有src源代码文件,也有dist打包文件。那么什么时候加载src,什么时候加载dist呢? 模块有两类:全局模块和部分模块。这两类模块有不同的加载约定: 全局模块:位于我的项目的node_modules目录中,零碎总是加载全局模块的dist打包文件部分模块:位于我的项目的src/module目录中,零碎优先查找src目录并加载模块源码,如果没有找到则加载部分模块的dist打包文件了解了全局模块与部分模块的代码加载约定,在将我的项目部署在生产环境时有利于做出正确的配置(次要的诉求就是:如何爱护商业代码)最佳实际(模块前端)在部署时,我的项目前端总是要进行整体编译,把所有全局模块和部分模块的前端源码和前端资源都打包,而后输入到我的项目的dist目录 如果模块作为部分模块而存在,则不须要思考模块前端的编译环节 如果模块要公布为全局模块,则必须先进行模块前端的编译 最佳实际(模块后端)1. 不进行模块编译如果没有爱护商业代码的需要,那么就不必思考模块编译的环节。在部署时,间接作为部分模块加载源码运行即可 2. 进行模块编译如果要进行模块编译,那么在部署时有两个抉择: 作为部分模块 模块依然位于我的项目的src/module目录将模块编译后,在生产环境删除模块的src源码目录即可作为全局模块 将模块编译后,公布至公司的公有仓库在我的项目中将模块作为全局模块装置至node_modules目录如果没有公有仓库,也能够采纳npm link机制装置为全局模块模块公布当我的项目中的模块代码稳固后,能够将模块公开公布,奉献到开源社区。也能够在公司外部建设npm公有仓库,而后把模块公布到公有仓库,造成公司资产,便于重复使用 $ cd /path/to/module$ npm run build:front$ npm run build:backend$ npm publish因为公布到npm仓库的模块将作为全局模块来应用,因而须要先编译模块的前端和后端效果图(模块后端编译)编译之前的源码构造 编译之后的输入文件 相干链接官网: https://cabloy.com/GitHub: https://github.com/zhennann/cabloy

July 4, 2021 · 1 min · jiezi

关于node.js:Node中F2A原理及功能实现总结

导语:之前做过一个小我的项目,其中用到了F2A(双因素认证)进行登录以及其余的用户身份认证,当初就这个性能的原理以及实现做一个总结。目录F2A原理实现办法实战演练F2A原理F2A就是双因素认证的缩写,一种采纳工夫同步技术的零碎,采纳了基于工夫、事件和密钥三变量而产生的一次性明码来代替传统的动态明码。 大家都晓得个别网站验证用户身份都是采纳单因素认证,比方:用户名+明码,还有的是手机号+短信验证码。 然而用户+明码的容易被黑客爆破,脱库,撞库进行获取;而短信验证码也容易被伪基站,钓鱼网站,WIFI等伎俩获取到,从而透露用户隐衷信息。 明天介绍的这个F2A就是在应用了上述提到的办法外,再另外加一层防护网,对用户登录进行二次验证,验证码是基于用户密钥独立生成的,随机生存的6位数。 而且是在独立的APP专门设施下面寄存,只有你本人能够查看,而且这个验证码是60秒切换一次,每次都不一样,加大了黑客破解的工夫难度。 实现办法持续关上上次的demo文件夹,而后创立一个f2a文件夹,写入一个文件index.js。 这次要实现的性能包含以下几点: 生成二维码性能;生成F2A密钥验证F2A明码生成二维码性能这个性能比较简单,装置一个qrcode就能够了。 $ npm install qrcode --saveconst express = require('express');const app = express();const qrcode = require('qrcode');app.get('/f2a/qrcode', (req, res) => { let url = req.query.url; if (!url) { return res.json({ code: 101, msg: 'get_fail', data: { info: "url不能为空!" } }); } qrcode.toDataURL(url, (err, data) => { return res.send('<img src="' + data + '">'); })})关上游览器,轻易输出一个网址参数,来测试一下。 这里应用百度一下:http://localhost:3000/f2a/qrcode?url=https://www.baidu.com/。 这里是预览截图: 生成F2A密钥接下来就是明天的配角退场,F2A双因素。 先来下载一个依赖包,装置一下引入文件。 $ npm install speakeasy --save获取F2A 这里次要应用generateSecret来创立F2A密钥信息; ...

July 4, 2021 · 2 min · jiezi

关于node.js:Node图形邮箱手机验证码实现方法总结

导语:之前做过一个小我的项目,其中用到了图形验证码,邮箱和手机号注册登录,这三者基本上是当初网站罕用的验证办法,当初就做一个应用操作总结。目录筹备工作原理解析办法总结在线体验筹备工作装置依赖包持续关上上次新建的demo文件夹,下载几个依赖包。 npm install svg-captcha nodemailer tencentcloud-sdk-nodejs --savesvg-captcha 能够创立图形验证码nodemailer 能够发送电子邮件tencentcloud-sdk-nodejs 能够发送短信申请筹备除了图形验证码能够装置后间接应用外,其余两个必须向邮箱服务商和云计算运营商申请受权密钥。 电子邮件申请办法举荐网站: QQ邮箱网易邮箱QQ邮箱申请步骤: 关上QQ邮箱登录进去;点击设置,而后关上账户选项卡,点击开启POP3/SMTP服务; 点击生成受权码,发送短信,点击我已发送,复制受权码到一个记事本外面去; 发送邮件服务器:smtp.qq.com,应用SSL,端口号465或587 网易邮箱申请步骤: 关上163邮箱登录进去;点击设置,而后关上设置选项卡,点击POP3/SMTP/IMAP; 点击开启POP3/SMTP服务,发送短信,点击我已发送,复制受权码到一个记事本外面去; 手机短信申请办法本次应用的是腾讯云提供的短信服务。 关上腾讯云官网注册登录进去;关上短信产品页面,当初是618流动期间,购买短信,大概1000条,38元; 而后点击控制台到短信控制台页面查看短信套餐; 接下来就是短信开明配置,参考这篇文章国内短信疾速入门; 依照下面操作实现后,你能够失去利用id和模板id。 到此,这个整个申请流程就完结了。 原理解析基本上几个验证形式都大同小异,能够独特演绎为以下几个步骤: 创立/发送验证码内容验证是否正确上面具体形容一下这个步骤。 创立/发送验证码内容图形验证码当咱们去申请一个api地址的时候,首先引入依赖包,配置好参数,生成一个svg格局的图形,而后响应申请,发送svg数据,就能够看到一个N位字符的图片了。 邮箱验证码到引入邮箱依赖包,配置好参数,而后去调用发送邮件办法,最初关上申请发送的邮箱账户,就能够看到一封电子邮件。 手机到引入手机依赖包,配置好参数,而后去调用发送短信办法,最初关上申请发送的手机短信app,就能够看到一条短信了。 验证是否正确客户端提交参数;服务端检测是否输出正确,返回提示信息;办法总结本大节次要是封装一些罕用的办法,而后编写脚本文件。 关上demo文件夹,创立一个captcha的文件夹,而后新建config.js,次要是搁置一些配置信息;新建一个api.js,次要是搁置一些罕用办法。 而后新建svg,email,phone三个文件夹,并且各自新建index.js文件。 get申请形式用于发送验证码,post申请形式用于验证验证码。 罕用办法关上config.js文件: // 图形,邮箱,手机的验证码const svg = { size: 4, // 验证码长度 ignoreChars: '012oOiILl', // 验证码字符中排除 0o1i noise: 1, // 烦扰线条的数量 fontSize: 52, color: true, //开启文字色彩 // background:"#000",//背景色 width: 200, height: 80, time: 2*60,}const email = { service: 'qq', port: 465, secure: true, user: 'xxx@xx.com', pass: 'xxxxxxxxxxxxxx', from: 'xxx@xx.com', time: 2*60,}const phone = { secretId: 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX', secretKey: 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX', reqMethod: "POST", reqTimeout: 30, endpoint: "sms.tencentcloudapi.com", signMethod: "HmacSHA256", region: "ap-shanghai", SmsSdkAppid: "XXXXXXX", // 利用id Sign: "DEMO", ExtendCode: "", SenderId: "", SessionContext: "", TemplateID: { eg: "XXXXXX", }, time: 2*60,}module.exports = { svg, email, phone}关上api.js文件: ...

July 4, 2021 · 6 min · jiezi

关于node.js:Node用户登录与注册功能总结

导语:之前做过一个小我的项目,其中波及到用户注册与登录的性能,当初把这个实现过程记录下来,以便日后查看保护。目录原理剖析实战案例原理剖析用户注册繁难流程图输出用户名和明码查看是否存在此用户存在则返回提醒不存在注册胜利 用户登录繁难流程图 实战案例mysql建表建表的无关办法在这篇《node和mysql的CURD总结》文章曾经说过了,上面间接建一张用户表。 -- 创立数据表mysql> CREATE TABLE `user` ( `id` int(11) NOT NULL COMMENT 'id', `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL COMMENT '用户名', `password` varchar(255) COLLATE utf8_unicode_ci NOT NULL COMMENT '明码', `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创立工夫', `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新工夫') ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='用户表';node编写依据下面的流程图,开始进行编写程序。 在进行编写之前。先在我的项目中装置一个依赖包,这个能够生成mysql语句。 npm install xqsqlxqsql npm地址 具体应用办法,点击地址有文档介绍。 用户注册app.post('/reg', async (req, res) => { let params = req.body; if (params.name && params.password) { let getSql = xqsql.get('user', { type: 'one', key: 'name', ids: [params.name], }, 'default', 'id,name'); let getSqlResult = await db(getSql); if (getSqlResult.code == 200 && getSqlResult.data.list.length == 0) { let addParams = [ { name: params.name, password: params.password, } ] let addFields = [ { name: '用户名', value: 'name', isMust: true }, { name: '明码', value: 'password', isMust: true }, ] let addSql = xqsql.add('user', addParams, addFields); let addSqlResult = await db(addSql); if (addSqlResult.code == 200) { return res.json({ code: 200, msg: 'get_succ', data: { info: "注册胜利!", } }); } else { return res.json(addSqlResult); } } else { return res.json({ code: 101, msg: 'get_succ', data: { info: "用户已存在!", } }) } } else { return res.json({ code: 101, msg: 'get_succ', data: { info: "用户名和明码不能为空!", } }) }})用户登录登录这部分的用户信息,这里应用session进行保留,你还能够抉择jwt,这次只用session。 ...

July 4, 2021 · 2 min · jiezi

关于node.js:Nodejs-express-accessdb-轻松实现小程序全栈开发下

1.新增数据依据后面的表和字段,当初咱们要在小程序端进行新增数据操作。 1). 首页,咱们先写新增数据接口,在/routes/anime.js退出以下代码。新增数据个别用post申请。因为波及到异步操作,所以用async、await进行操作。因为没做文件上传,所以,cover_url我就间接写了。图片是放在/public/images上面的。 ...const {mysql, mongodb} = require('access-db') //引入mysql操作方法,如果是mongodb,就引入对应的...//这里用postrouterAnime.post('/add', async function(req, res, next) { const {title, total, type} = req.body //小程序端上传的数据 try{ let tempRes = await mysql.set('anime', { title: title, cover_url: 'http://localhost:3000/images/1.webp', total: total, type: type, follows: 23 }) res.json(tempRes.data.insertId) }catch(err) { console.log('errrr', err) }});req.body就是post申请时,所带的参数。mysql.set办法,就是新增数据,第一个参数就是数据表表名,第二个参数,就是要新增的内容。字段名必须和数据表外面字段名统一。此时的接口地址为:http://localhost:3000/anime/add 批改代码之后,记得重新启动后盾服务 2). 在微信小程序外面,增加一个绑定事件addOneData index.wxml <!--index.wxml--><view class="container"> <button bindtap="addOneData">新增数据</button></view>index.js ...addOneData(){ wx.request({ url: 'http://localhost:3000/anime/add', method: 'POST', data: { title: '鬼灭之刃', total: 26, type: 1 }, success: (res) => { console.log('res', res) } })}...最初,点击按钮,即可胜利增加数据了,留神关上不校验域名的设置。 ...

July 4, 2021 · 1 min · jiezi

关于node.js:Nodejs-express-accessdb-轻松实现小程序全栈开发上

本次教程,只是给大家抛砖引玉,适宜老手。只有你懂js,那你就会全栈! 1.新建小程序我的项目如下,咱们关上微信开发者工具,并创立一个名为test的小程序我的项目,我的项目在mini目录上面。 创立实现之后,会生成一个初始代码,如下: 2.新建express我的项目在下面小程序我的项目目录mini的同级目录外面,新建一个server目录,并在该目录下,关上命令窗 在命令窗执行以下命令,创立我的项目 # 初始化我的项目,而后始终回车就能够了npm init# 装置expressnpm install express# 生成express我的项目模板,抉择ynpx express-generator# 装置我的项目依赖npm install实现后,我的项目代码如下构造 其中,咱们目前只须要写接口,所以只须要在routes,app.js外面进行操作。 此时,执行 npm run start 启动服务器,拜访http://localhost:3000呈现如下界面,阐明胜利了。 3.装置mysql或mongodbmysql或mongodb你能够任意抉择一种,不影响前面的根底教学 mysql装置:如果你只是为了不便学习,倡议装置mysql5.7版本的,8.0版本的明码类型,目前node还不反对,须要你改配置。所以,如果你不想折腾,能够就抉择5.7。装置好之后,咱们就能够通过数据库可视化工具连贯它,如下 连贯胜利后,咱们新建一个test数据库,其余两个选项,就默认即可 mongodb装置:我这里就不写了,和mysql差不多的步骤。 4.创立表anime如图,创立一张存储动漫信息的简略表,其中id肯定要设置成主动递增 5.后盾接口在之前新建的我的项目目录server上面,装置access-db和dotenv npm install access-dbnpm install dotenv1).在app.js的最后面引入dotenv,如下: require('dotenv').config()var createError = require('http-errors');var express = require('express');...2).在我的项目根目录,新建.env,并配置数据想着信息。如果你是mongodb就配置mongodb的想着信息,具体配置,请看access-db文档 MYSQL_HOST=localhost MYSQL_USER=rootMYSQL_PASSWORD=123456MYSQL_PORT=3306MYSQL_DATABASE=test //要应用的哪个数据库3).在/routes目录下,新建anime.js路由,代码如下: var express = require('express');var routerAnime = express.Router();/* GET users listing. */routerAnime.get('/', function(req, res, next) { res.send('anime api');});module.exports = routerAnime;4).在app.js中引入下面的路由: ...

July 4, 2021 · 1 min · jiezi

关于node.js:nodeexpress框架搭建服务器

1.首先确保计算机曾经装置了node.js,如果没有装置请返回node.js官网下载并装置。2.设置全局环境变量。3.实现下面两步后,关上命令行工具(cmd),并依照如下格局输出:node -v此时命令行会呈现node的版本号等相干信息,这时咱们的node.js曾经正确装置了。4.首先在指定的盘符上面创立一个名为app的文件夹,用来存储node服务器文件,并在此文件夹下创立一个服务端的主文件,咱们把它命名为:app.js,文件代码如下: const express=require('express');var app=express();app.listen(3000);console.log("服务器启动胜利")上述代码就曾经实现了一个简略的web服务器,这时通过命令行或者编辑器终端运行node app.js,会呈现找不到模块的谬误提醒,那么咱们应用node自带的npm命令来装置express模块,命令如下:npm install express这时在当前目录下会生成一个名为node_modules的文件夹,外面就装置有express模块,这时咱们再从新运行 node app.js即可失常提醒服务器启动胜利!5.在以后app文件夹下,创立数据库连接池文件pool.js,代码如下: const mysql=require('mysql')//这里须要应用node自带的npm装置命令进行装置mysql模块var pool = mysql.createConnection({ host : 'localhost', port : 3306, database : 'node', user : 'root', password : 'root'})`module.exports=pool`以上连接池数据:host为数据库链接地址,port为数据库端口号,database为数据库名称,user为数据库用户名,password为数据库明码,module.exports=pool意为导出pool模块。如果短少module.exports=pool,在其余模块中引入连接池会报错!6.在以后app文件夹下创立routers文件夹,此文件夹用来存储其它路由模块,比方login(登录),reg(注册)等!在routers文件下创立登录路由(login.js),代码如下 const express=require('express');const pool=require('../pool.js');var router=express.Router();router.post('/',(req,res)=>{ var uname=req.query.uname, var upwd=req.query.upwd, var sql=`select id from where uname=?&upwd=?`, pool.query(sql,[uname,upwd],(err,result)=>{ if(err) throw err console.log(result) })})module.exports=router实现了此段代码后,咱们返回app文件夹下,批改app.js文件,代码如下: const express=require('express');var app=express();app.listen(3000);const login=require('./routers/login')console.log("服务器启动胜利")app.use('/login',login)应用终端命令运行node app.js,这时一切正常!然而咱们通过客户端post提交数据时,咱们会发现服务端无奈获取客户端提交的数据,无奈进行失常的登录操作! 对于客户端post提交数据无奈获取的解决方案,下一次再解决!明天就写到这里

July 3, 2021 · 1 min · jiezi

关于node.js:Nodejs学习笔记

1.1 Express 简介官网给出的概念:Express 是基于 Node.js 平台,疾速、凋谢、极简的 Web 开发框架。 艰深的了解:Express 的作用和 Node.js 内置的 http 模块相似,是专门用来创立 Web 服务器的。 Express 的实质:就是一个 npm 上的第三方包,提供了疾速创立 Web 服务器的便捷办法。 Express 的中武官网: http://www.expressjs.com.cn/ 1.2 Express 的根本应用1. 装置 在我的项目所处的目录中,运行如下的终端命令,即可将 express 装置到我的项目中应用: npm i express@4.17.12. 创立根本的 Web 服务器 监听 GET **申请 ** 通过 app.get() 办法,能够监听客户端的 GET 申请,具体的语法格局如下 //参数1:客户端申请的URL地址//参数2:申请对应的处理函数// req:申请对象(蕴含了与申请相干的属性与办法)// res:响应对象(蕴含了与申请相干的属性与办法)app.get("申请url",function(req,res)){ /* 处理函数 */}监听 POST **申请 ** 通过 app.post() 办法,能够监听客户端的 POST 申请,具体的语法格局如下 //参数1:客户端申请的URL地址//参数2:申请对应的处理函数// req:申请对象(蕴含了与申请相干的属性与办法)// res:响应对象(蕴含了与申请相干的属性与办法)app.post("申请url",function(req,res)){ /* 处理函数 */}获取 URL **中携带的查问参数 ...

July 3, 2021 · 4 min · jiezi

关于node.js:nginx-错误调试应该如何处理

nginx 谬误调试一则例子 nginx的日志,有主过程日志和子过程日志之分。主过程就是nginx过程,子过程就是这些worker过程。要调试谬误,最好把子过程日志关上。 明天部署fastdfs的时候,能上传图片,拜访图片报http 400谬误。http400谬误就是服务器过程有问题。 因为没有关上子过程日志,拜访curl -v 之后程序hang住。没有听错,程序hang住了。 什么问题呢?这个时候把子过程日志关上: vim nginx_fastdfs_storage.conf server { listen 8888;server_name localhost;access_log logs/access.log main; ##关上日志location ~* /(?:app|accsett)/M00/(.+)?__width_([0-9]+)?__height_([0-9]+)?__networkType_(.+)?\.(jpg|jpeg|gif|png|webp) { 省略。。。。}location ~/(app|accsett)/M00 { ngx_fastdfs_module;}error_page 500 502 503 www.pizei.com504 /50x.html;location = /50x.html { root html;}} 而后再次拜访curl -v ,发现还是hang住,子过程不见了。同时页游后盾报错: ERROR - file: ../common/fdfs_http_shared.c, line: 153, param "http.mime_types_filename" not exist or is empty work process 过程解体了,导致hang住,有谬误。既然有谬误日志,就好办了,百度搜寻解决了。次要展现是nginx的调试过程

July 2, 2021 · 1 min · jiezi

关于node.js:VS-Code官方插件集与工具

如果您也应用VS Code作为CabloyJS我的项目开发的主编辑器,那么能够参考官网应用的插件集,此外也提供了一些周边工具 这是官网亲测可用的最简插件集,再也不用东奔西走了插件集插件名称用处VimVim模仿ESLintJS格局验证及修复VeturVue语言服务.ejsejs语言服务Beautify css/sass/scss/less格式化样式表All Autocomplete从已关上文件生成主动实现条目settings.json关上零碎配置文件settings.json,增加以下配置: { ... "editor.tabSize": 2, "editor.formatOnSave": true, // eslint "editor.codeActionsOnSave": { "source.fixAll.eslint": true }, // associations "files.associations": { "*.js.ejs": "javascript", "*.css.ejs": "css", "*.less.ejs": "less" },}代码片段在我的项目根目录提供了代码片段的样本文件:.vscode/cabloy.code-snippets,不便咱们疾速生成各类代码骨架,目前提供的代码片段如下: /*** supported code snippets as follows:* controller service model route* atom broadcast event local* middleware queue schedule sequence* startup stats test**/启动项配置在我的项目根目录提供了启动项配置文件:.vscode/launch.json,不便咱们间接启动后端服务,进入调试环境

July 1, 2021 · 1 min · jiezi

关于node.js:node-js-各类数据库常用方法封装的心路历程

这是我写出access-db办法库所经验的一个过程,在这里记录下吧 想法的诞生小公司的倒退原本就不易,老本方面,是能有多节约就多节约。有时多集体干的事转由一个人干,也是毫不奇怪。也是在这种状况下,我缓缓的成了全栈开发。 最后为了省钱,外加咱们只做小程序,就抉择了第三方云服务商作为后盾。刚开始还好,前面久了,发现他们提供的接口办法应用起来并没有想像的那么轻松。特地是在简单查寻的状况下,代码太过简单,不易读,批改起来也不不便。于是我就开始思考怎么去简化他的查寻。上面这个查寻办法,就是封装的最后版,能够看到,fetchFindByCheck应用起来也并不是那么的简略,并且,它还只能反对最简略的and,or查寻,代码的可读性和灵活性都不高。 fetchFindByCheck({ tableName: app.table.active_sign, relationship: ['and', 'and'], way: ['in', 'compare', 'compare'], params: [ { key: 'child_id', value: childID }, { key: 'active_id', operator: '=', value: that.aid }, { key: 'is_delete', operator: '=', value: false }, ], limit: 30, page: 1, order_by: '-created_at', expand: [],}).then((res2) => { let tempJoined = res2.data.objects console.log('tempJoin', tempJoined)},(err)=>{})但即使如此,我还是封装了一套最简略的办法。 minapp-fetch 呈现用过云服务的必定都晓得,云服务有很多类别的接口。就比方微信云开发,它会提供小程序端的接口、云函数的接口、甚至web接口。咱们抉择的云服务商,刚开始用得还好,前面因为业务多样化,咱们又面临不得不应用web的状况。而且,云服务商提供的web接口也和小程序下面的调用形式不一样,就导致即便同样的查寻,也要写两套不同的查寻办法。如果你还要用他的云函数、或者其余端的api,那更是让你头大。 怎么办呢?为了加重开发和保护难度,进步开发效率。我产生了一个大胆的想法:要是能把各个端的接口都对立成一种,那不就很简略了吗。想法是好的,但实现起来就没那么容易了。最后在写web端的接口时,我好几次都想放弃,感觉把这些不同的写法,对立成一种,真的是有点难。因为你岂但要尽可能的保障同一种增删改查,在不同端失去的后果是一样的,还要通过算法,保障封装的办法尽可能的简略。 通过一段时间的奋斗,办法终于进去了,这个时候,我给它取了一个名字,叫做 minapp-fetch ,当初也公布在了npm上,但它只反对咱们应用过的云服务商的api。它的写法更加简洁,如下: fetchFind(app.table.question, { p1: { way: 'compare', data: ['status', '>', 0] }, p2: { way: 'compare', data: ['is_admin_answered', '=', false] }, p3: { way: 'compare', data: ['is_admin_read', '=', false] }, r: 'p1 && (p2 || p3)', page: commen.page, limit: commen.limit, order_by: '-created_at', expand: ['created_by']})其中,p参数为每一个小条件,r为小条件的and、or,page为翻页,limit为每页数量,order_by为排序。尽管此时看着是比拟清晰了,但它还是有有余的中央。首先,p条件写法,还是有些繁琐;其次,就是r规定外面,不反对括号嵌套;再就是,它反对的办法也不多。 ...

July 1, 2021 · 2 min · jiezi

关于node.js:koa实践总结

什么是koa?koa是Express的下一代基于Node.js的web框架。应用 koa 编写 web 利用,通过组合不同的 generator,能够罢黜反复繁琐的回调函数嵌套,并极大地晋升罕用错误处理效率。Koa 不在内核办法中绑定任何中间件,它仅仅提供了一个轻量优雅的函数库,使得编写 Web 利用和API变得得心应手。 Koa能干什么?主要用途 网站(比方cnode这样的论坛)api(三端:pc、挪动端、h5)与其余模块搭配,比方和socket.io搭配写弹幕、im(即时聊天)等koa是微型web框架,但它也是个Node.js模块,也就是说咱们也能够利用它做一些http相干的事儿。举例:实现相似于http-server这样的性能,在vue或react开发里,在爬虫里,利用路由触发爬虫工作等。比方在bin模块里,集成koa模块,启动个static-http-server这样的性能,都是非常容易的。 搭建我的项目启动服务// 1. 创立我的项目文件夹后初始化npmnpm init// 2. 装置koa环境npm install koa// 3. 根目录下创立app文件夹作为咱们源代码的目录// 4. app下新建index.js作为入口文件生成目录构造如下: 编写app/index.js const Koa = require('koa');const app = new Koa();const port = '3333';const host = '0.0.0.0';app.use(async ctx => { ctx.body = 'Hello World';});app.listen(port, host, () => { console.log(`API server listening on ${host}:${port}`)});根目录下运行node app/index.js,启动胜利后控制台呈现API server listening on 0.0.0.0:3333,关上浏览器拜访本机ip:3333 路由解决koa中解决相应的路由返回对应的响应这一开发过程相似java中编写controller,restful格调的路由能够十分语义化的依据业务场景编写对应的处理函数,前端利用axios拜访服务端找到对应的函数(路由名字)来获取对应想要的后果。 编写app/index.js: // app/index.jsconst Koa = require('koa');const app = new Koa();const port = '3333';const host = '0.0.0.0';app.use(async ctx => { const { path } = ctx; console.log(path) if (path === '/test1') { ctx.body = 'response for test1'; } else if (path === '/test2') { ctx.body = 'response for test2'; } else if (path === '/test3') { ctx.body = 'response for test3'; } else { ctx.body = 'Hello World'; }});app.listen(port, host, () => { console.log(`API server listening on ${host}:${port}`)});留神:每次在koa中更新代码后想要失效必须重启koa服务 ...

June 28, 2021 · 7 min · jiezi

关于node.js:讲解CSE240

CSE240 – Assignment 4Points 50IntroductionThe aim of this assignment is to get you to create a simple linked-structure datastructure with C/C++ structs.Objectives Build a Grab-Bag Data Structure using Linked-Nodes Build a linked-node structure that has some basic link-list stylefunctionality Use this Grab-Bag to create and play Hi-Low-Guess game Create one or more Stucts Use and manage several pointersOutcomes: Linked-Data Data Structure creation and application User interaction Creation and use of structs Pointer use, management and manipulationDescription:One of the keys to winning card games is to understand probability. CardCounting is a much vaunted skill amongst Black Jack players and Casinos arealways on the look out to prevent such a skill tipping the odds in favor of aplayer.This assignment is going to create a very basic game to show how card countingworks. We will make a Hi-Lo-Guess game. The player will be presented a card andguess if the next card will be higher or lower. The player will be given a pointfor each time they guess correctly.Each round the game will calculate the probability of the next card being higheror lower and the probability of drawing any specific number.This will be accomplished by simulating a deck of cards with a Grab-Bag datastructure.Grab BagThe Grab-Bag is a simple data structure that can be created either with an arrayor a linked structure (We are going to opt for the linked structure). The GrabBaghas two major functions: add things to the bag remove things RANDOMLY from the bagSpecificationsBag (65% specification)You are to implement a Grab-Bag data structure in C/C++. You may choose to useeither language as your code base.You will create several structs to accomplish this: Card Structo Suito Value BagNodeo Card* cardo BagNode* nextYou will maintain any and all necessary pointers to create and maintain the bag.This should be similar to a linked-list in approach. A head pointer and possiblya tail pointer are good ideas.You will also implement several functions to create the functionality of the bag: getCurrentSize():int – item count of bag isEmpty():bool/int – is the bag empty or not add(<item>) – Add the item to the bago Hint – think about which add function you want to use from the linkedlisto Hint – Remember we remove randomly … so … do we need any fancyinsertion? grab():Card – get a card out of the bag!o Remember this is random Hint – arbitrary remove Hint – don’t forget your cases getFrequencyOf(<item>):int – get a count of how many of an item is in thebag empty() – empty the bag fillWithCards() – fill the bag with a new deck of 52!I have not outlined perfectly every function that you may need or write. Theabove functions are REQUIRED though. You may implement any needed functions tohelp or perform other tasks.Also note that I don’t have the parameters perfectly laid out for you.You will have to pass pointers around to make these functions work.If you are using C – remember you don’t have Pass-By-Reference, so make sure youreturn that Head pointer or otherwise deal with that problem.If you are using C++ - remember you DO have Pass-By-Reference, use that to youradvantage.Hi-Low-Guess GameYour goal is to create a simple “Hi-Low-Guess” game for the player to play. Thecomputer will act as the dealer and the player will be given 3 options: the nextcard will be higher, the next card will be lower, guess the next card.If the player guesses higher or lower and they are correct they get a point. Ifthey guess a specific card, they get 5 points!If the card is equal value, the player neither wins or loses and is awarded 0points and is prompted to guess again.Each time the player is offered a guess they should be shown: All the cards that have been drawn so far The last card drawn that you’re guessing against The probability the next card will be higher The probability the next card will be lower The probability of drawing a specific valueOther requirements: The player will keep guessing until they get their guess wrong You should re-populate the deck after the deck has been 2/3rds usedo Leave the last card drawn out thougho Make sure you tell the player that the deck was re-filled Count Aces as low (value 1)Notes: The bag is the deck. Since you pick stuff out of the bag randomly, youdon’t have to shuffle it You should use H, D, S and C for Hearts, Diamonds, Spades and Clubs You should use numerical values 1 – 13 for card values Make a printCard function that “pretty prints” your card for you While there are explicitly required functions for the high-low game – YOUARE EXPECTED TO WRITE APPROPRIATE FUNCTIONS The player can play as long as they keep guessing correctly. Don’t forgetto refill the bag after 34 cards have been drawn. Don’t forget to tell youruser that you are doing so.Sample output:Cards drawn:[K-H] [4-S] [7-D]Cards left in deck: 49Probability of next card being higher: 46.94%Probability of next card being lower: 46.94%%Probability of next card being the same: 6.12%Probability of next card being:A 8.16%2 8.16%3 8.16%4 6.12%5 8.16%6 8.16%7 6.12%8 8.16%9 8.16%10 8.16%J 8.16%Q 8.16%K 6.12%Last card: [7-D]Points: 2Choose option:1 – Next card will be higher2 – Next card will be lower3 – Guess exact valueUse cases: If the user selects 1 or 2, draw the next card.o Award a point if the user guessed right and prompt them for their nextguess showing all the above information.o If the user guesses wrong. It’s game over. Tell them “GAME OVER” andshow them their score. Exit the game.o If the card is the same value as the previous card, then tell the user“Same card” and give them 0 points and prompt them for their nextguess showing all the above information. If the user uses option 3:o Prompt the user for the value they want to guess.o Draw the next card.o If the value matches, then give the user 5 points and prompt them fortheir next guess showing all the above information.o If the value doesn’t match, it’s game over. Tell them “GAME OVER” andshow them their score. Exit the game.Extra Credit +5Implement the Bag entirely in its own library <lastname>_<firstname>_bag.h &<lastname>_<firstname>_bag.c (or .cpp).Create a Makefile to compile the code.Recommended reading:https://www.geeksforgeeks.org/write-header-file-c/https://gcc.gnu.org/onlinedocs/gcc-3.0.2/cpp_2.htmlGrading of Programming AssignmentThe TA will grade your program following these steps:(1) Compile the code. If it does not compile a U or F will be given in theSpecifications section. This will probably also affect theEfficiency/Stability section.(2) The TA will read your program and give points based on the points allocatedto each component, the readability of your code (organization of the code andcomments), logic, inclusion of the required functions, and correctness of theimplementations of each function.Rubric:What to Submit?You are required to submit your solutions in a compressed format (.zip). Zip allfiles into a single zip file. Make sure your compressed file is labeled correctly ...

June 27, 2021 · 7 min · jiezi

关于node.js:npmyarn

一、装置yarn (1)下载node.js,应用npm装置 npm install -g yarn (2)查看版本 yarn --version(3)yarn淘宝源装置 yarn config set registry https://registry.npm.taobao.org -g yarn config set sass_binary_site http://cdn.npm.taobao.org/dis... -g二、yarn和npm命令比照 npm yarn 正文npm init yarn init 初始化我的项目npm install yarn 装置全副依赖npm install react --save yarn add react 装置某个依赖,保留到 dependenciesnpm uninstall react --save yarn remove react 移除某个依赖npm install react --save-dev yarn add react --dev 装置某依赖,保留到 devDependenciesnpm update [package] --save yarn upgrade [package] 更新生产环境某个依赖包npm install axios --global yarn global add axios 全局装置某个依赖npm install --save axios vue-axios yarn add axios vue-axios 同时下载多个依赖包npm install [package]@[version] yarn add [package]@[version] 装置指定版本的包npm rebuild yarn install --force 从新下载所有包… … … yarn和npm能够通过镜像源工具nrm相互切换 ...

June 23, 2021 · 2 min · jiezi

关于node.js:如何处理alert日志中出现Private-Strand-Flush-Not-Complete

Fri Oct 17 19:59:51 2014 Thread 1 cannot allocate new log, sequence 4722 Private strand flush not complete Current log# 1 seq# 4721 mem# 0: /oradata/sgomp5/redo01.log Thread 1 advanced to log sequence 4722 (LGWR switch) Current log# 2 seq# 4722 mem# 0: /oradata/sgomp5/redo02.log Historically, Every user session wrote the changes to redo log buffer and changes from redo log buffer are flushed to redo logs on disk by lgwr. As number of users increased, the race and the need to get latch for redo allocation and redo copy on the public redo buffer increased. ...

June 23, 2021 · 4 min · jiezi

关于node.js:如何解决gateway问题

1.写个配置类CorsConfig (如果不行,能够不写此类,和springcloud的版本无关) package net.youqu.micro.service.config;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.web.cors.CorsConfiguration;import org.springframework.web.cors.reactive.CorsWebFilter;import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource;import org.springframework.web.util.pattern.PathPatternParser;/** description:java页游我的项目www fhadmin org */public class CorsConfig { public CorsWebFilter corsFilter() { CorsConfiguration config = new CorsConfiguration(); config.addAllowedMethod("*"); config.addAllowedOrigin("*"); config.addAllowedHeader("*"); UrlBasedCorsConfigurationSource source = www.sangpi.comnew UrlBasedCorsConfigurationSource(new PathPatternParser()); source.registerCorsConfiguration("/**", config); return new CorsWebFilter(source);}} 配置 application.properties 形式--------gateway配置--------跨域配置spring.cloud.gateway.globalcors.corsConfigurations.[/*].allowedOrigins=spring.cloud.gateway.globalcors.corsConfigurations.[/*].allowedHeaders=spring.cloud.gateway.globalcors.corsConfigurations.[/*].allowedMethods=spring.cloud.gateway.globalcors.corsConfigurations.[/**].allowCredentials=trueyaml 形式 spring: cloud: gateway: globalcors: corsConfigurations: '[/**]': allowCredentials: true allowedHeaders: '*' allowedMethods: '*' allowedOrigins: '*'

June 23, 2021 · 1 min · jiezi

关于node.js:每日灵魂一问Node性能如何进行监控以及优化

一. Node性能指标:1. CPU(同步会占用,异步不会)CPU负载CPU使用率 2. 内存在Node中,一个过程的最大内存容量为1.5GB。因而咱们须要缩小内存泄露 // rss 示意node过程占用的内存总量// heapTotal:示意堆内存的总量。// eapUsed:理论堆内存的使用量。// external :内部程序的内存使用量,蕴含Node外围的C++程序的内存使用量// /app/lib/memory.jsconst os = require('os');// 获取以后Node内存堆栈状况const { rss, heapUsed, heapTotal } = process.memoryUsage();// 获取零碎闲暇内存const sysFree = os.freemem();// 获取零碎总内存const sysTotal = os.totalmem();module.exports = { memory: () => { return { sys: 1 - sysFree / sysTotal, // 零碎内存占用率 heap: heapUsed / headTotal, // Node堆内存占用率 node: rss / sysTotal, // Node占用零碎内存的比例 } }}3.磁盘 I/O内存 IO比磁盘IO 快十分多,所以应用内存缓存数据是无效的优化办法。罕用的工具如 redis、memcached等 4. 网络二.如何监控Easy-Monitor 2.0 ...

June 21, 2021 · 1 min · jiezi

关于node.js:gyp-ERR与nodepregyp-ERR

问题:共事写的一个vue我的项目在我的电脑上运行npm install时报错: gyp ERR! build error gyp ERR! stack Error: `make` failed with exit code: 2gyp ERR! stack at ChildProcess.onExit (/Users/xxx/xxx/node_modules/node-gyp/lib/build.js:262:23)gyp ERR! stack at ChildProcess.emit (events.js:315:20)gyp ERR! stack at Process.ChildProcess._handle.onexit (internal/child_process.js:275:12)gyp ERR! System Darwin 17.7.0gyp ERR! command "/usr/local/bin/node" "/Users/xxx/xxx/node_modules/node-gyp/bin/node-gyp.js" "rebuild" "--verbose" "--libsass_ext=" "--libsass_cflags=" "--libsass_ldflags=" "--libsass_library="gyp ERR! cwd /Users/xxx/xxx/node_modules/node-sassgyp ERR! node -v v12.18.0gyp ERR! node-gyp -v v3.8.0gyp ERR! not ok 问题出在node-gyp上,然而网上的答案试了几个(1、重新安装node-gyp、2、从新设置权限用户sudo npm install --unsafe-perm、3、从新设置 Xcode的门路sudo xcode-select -s /Applications/Xcode.app/Contents/Developer)都没能解决 解决方案:问题还是出在node和node-gyp版本不兼容上,能够用升降node版本来解决。我的mac零碎较老,抉择了降node版本v11.10.0

June 19, 2021 · 1 min · jiezi

关于node.js:踩坑nodejs-mysql

前几天闲暇工夫利用node + express + mysql 写了一套订单管理系统。我的项目跑在本地测试均未发现问题,部署到服务器上也没啥问题;奇怪的是比方我早晨部署下来,部署完测试没问题,所有拜访都失常,然而睡一觉起来,查问就502了;重启服务当前又好了,放着过段时间,又挂了..... 起初通过查看日志发现了如下谬误原来是数据库的谬误,然而这是为什么? 咱们先来看看mysql模块的应用办法,官网举荐咱们这样建设连贯问题就是出在这!!!因为常识的盲区,我本来认为建设一次连贯当前将该实例保留下来,当前每次查问都应用这个实例,可能为零碎节俭开销 但起初通过多方的材料收集,发现mysql在闲暇肯定的工夫(大略是8小时)会断开连接,后教训证也的确如此,只不过工夫如同不是八小时 过后的验证办法是在呈现谬误的时候将connection对象中的state状态记录到日志文件,果然,呈现谬误的时候connection对象还存在,然而此时的连贯状态曾经变为了断开连接,难怪会产生下面的谬误! 找到了问题那么胜利解决问题的几率就有了90%;看到网上有说写一个定时工作,每隔一小时,对数据库进行一次查问(此查问实际上是无用的查问,目标只是为了不让数据库连贯断开,有点相似于心跳包的感觉)这不失为一个解决的方法,然而集体总感觉这不是解决的最佳计划,于是乎又从头到尾读了一遍mysql的文档,在这下面找到了答案应用连接池,当查问实现后将该连贯返回到连接池,以便于其余连贯持续应用接下来革新代码,改为池连贯目前我的项目部署在阿里云曾经有快一星期了问题没有再复现;写下这篇文章记录一下这个坑,文笔不好,多多包涵!

June 18, 2021 · 1 min · jiezi

关于node.js:每日灵魂一问Nodejs文件查找的优先级Require-方法的文件查找策略

模块标准在Node中每一个js文件都是一个独自的模块 模块中包含CommonJS标准的外围变量:导出:exports、module.exports导入:require 通过上述变量进行模块化开发 查找策略1.原生模块:http、fs、path等 require后优先查看模块是否在原生模块列表中2.相对路径的文件模块:./mod或../mod 如果按确切的文件名没有找到模块,则 NodeJs 会尝试带上 .js、.json或 .node拓展名再加载3.绝对路径的文件模块:/pathtomodule/mod 速度最快4.目录作为模块:./dirname 会.js .json /main/index.js /main/index.node5.非原生模块的文件模块:mod 查找程序以后文件夹的node_modules下找 下层目录下的node_modules下找 上下层目录下的node_modules下找 上上下层目录下的node_modules下找 ....... 总结1.缓存的优先级最高2.内置模块优先级次之3.如果是绝对路径 / 结尾,则从根目录找4.如果是相对路径 ./结尾,则从以后require文件绝对地位找5.如果文件没有携带后缀,先从js、json、node按程序查找6.如果是目录,则依据 package.json的main属性值决定目录下入口文件,默认状况为 index.js7.如果文件为第三方模块,则会引入 node_modules 文件向下级递归查找

June 17, 2021 · 1 min · jiezi

关于node.js:每日灵魂一问nodejs事件循环

事件循环背景nodejs是基于v8引擎的JavaScript运行时 nodejs是基于libuv实现 异步非阻塞式i/o 操作的。而事件循环是nodejs解决非阻塞式I/O操作的机制 失常js执行程序为:1、主线程执行栈全副工作执行结束。(同步工作)2、查看微工作队列, 2.1 process.nextTick优先级最高,总是最先执行 2.2 Promise的then回调;await 前面的内容3、查看宏工作队列,提取一次工作推入执行栈,进行执行。 宏工作队列也就是事件循环分为6个阶段: 1.timers阶段 (setTimeout、setInterval)2.I/O事件回调阶段(I/O callbacks)阶段 3.闲置阶段(idle, prepare):仅零碎外部应用4.轮询阶段(poll)5.查看阶段(check):setImmediate()6.close callbacks阶段:执行close事件回调 例题例题1console.log('main');setImmediate(function() { console.log('setImmediate');});new Promise(function(resolve, reject) { resolve();}).then(function() { console.log('promise.then');});1.console.log('main');退出同步队列2.setImmediate(function() { console.log('setImmediate');});退出宏工作中的查看阶段(check)3.promise的回掉退出微工作队列中 例题2async function async1() { console.log('async1 start') await async2() console.log('async1 end')}async function async2() { console.log('async2')}console.log('script start') // 1.退出同步队列setTimeout(function () { // 2.退出宏工作的timer阶段 console.log('setTimeout0')}, 0)setTimeout(function () { // 3.退出宏工作的timer阶段 console.log('setTimeout2')}, 300)setImmediate(() => console.log('setImmediate')); // 4.退出宏工作的check阶段process.nextTick(() => console.log('nextTick1')); // 5.退出微工作队列async1(); //6.执行async1// 执行async1中的async2// 把await async2()后的内容退出微工作队列process.nextTick(() => console.log('nextTick2'));// 7.退出微工作队列 process.nextTick优先级最高 所以提前new Promise(function (resolve) { console.log('promise1') // 7.退出同步工作 resolve(); console.log('promise2') // 8.退出同步工作}).then(function () { console.log('promise3') // 9.退出微工作}) console.log('script end') // 10.退出同步工作后果如下script startasync1 startasync2promise1promise2script endnextTick1nextTick2async1 endpromise3setTimeout0setImmediatesetTimeout2 ...

June 16, 2021 · 1 min · jiezi

关于node.js:npm安装遇到的各种失败的解决方案

转载自:https://cloud.tencent.com/dev...

June 15, 2021 · 1 min · jiezi

关于node.js:nodejsPuppeteer无头浏览器-实现服务端批量生成PDF-文件

利用场景:客户在创立前后端拆散的利用时,前端只用于做一些根本的数据展现,如果波及大量的数据或报表生成,倡议放在服务器端展现,本文次要分享如何在服务器端应用ActiveReportsJS 实现报表导出PDF性能 Demo下载: https://gcdn.grapecity.com.cn/forum.php?mod=attachment&aid=MTIzMjQwfGMwM2JkNWVhfDE2MjM3MjI5NzF8MjkzODJ8ODgwNzA%3D环境筹备:node.js v14.15.0+Headless 无头浏览器 操作步骤: 增加资源文件配置资源和文件const puppeteer = require('puppeteer');const fs = require('fs');var static = require('node-static');var http = require('http');var file = new(static.Server)(__dirname + '/resources');http.createServer(function (req, res) { file.serve(req, res);}).listen(9999);const fonts = [ { name: 'Montserrat', source: 'Montserrat-Regular.ttf' }, { name: 'Montserrat', source: 'Montserrat-Medium.ttf', weight: 500 }];3. 调用浏览器并初始化 调用ARJS 导出PDF文件 (async () => { const browser = await puppeteer.launch({headless: true}); const page = await browser.newPage(); await page.goto(`http://localhost:9999/host.html`); //await page.goto(`${__dirname}/resources/host.html`); const pdfString =await page.evaluate(({reportUrl, fonts}) => new Promise(async (resolve, reject) => { // await GC.ActiveReports.Core.FontStore.registerFonts(fonts); const report = new GC.ActiveReports.Core.PageReport(); await report.load(reportUrl); const doc = await report.run(); const result = await GC.ActiveReports.PdfExport.exportDocument(doc, {fonts: fonts, info: {author: 'GrapeCity'}}); const reader = new FileReader(); reader.readAsBinaryString(result.data); reader.onload = () => resolve(reader.result); reader.onerror = () => reject('Error occurred while reading binary string'); }), {reportUrl: 'SimpleTable.rdlx-json', fonts: fonts}); const pdfData = Buffer.from(pdfString, 'binary'); fs.writeFileSync(`${__dirname}/out115.pdf`, pdfData); console.log('done'); process.exit(0);})();

June 15, 2021 · 1 min · jiezi

关于node.js:nodejs端模块化方式comomjs详解

nodejs端实现模块化的形式通常是通过commonjs,应用模块化能够复用js代码,使得逻辑构造更为清晰。 commonjs的语法规定如下通过 module.exports 或者 exports 导出,通过 require函数来导入 // a.js 导出内容const name = 'alice'const age = 16module.exports = { name, age}// b.js 导入const obj = require('./a.js')console.log(obj) // { name: 'alice', age: 16}module.exports和exports 导出不同的书写形式 // a.jsconst name = 'alice'const age = 16exports.age = agemodule.exports.name = name// b.jsconst obj = require('./a.js')console.log(obj) // { name: 'kiki', age: 16 }两者的不同之处在于,即便通过 exports.xxx 导出,其实最终也是通过 module.exports 这样的形式进行导出的,因为在node外部,初始化时先将一个空对象赋值给 exports,而后再将exports赋值给module.exports,所以通过 exports.xxx 这样的模式就相当于在 module.exports 这个对象外面追加子元素 如果间接给module.exports赋值为一个新的对象,那么后果就不一样了 // a.jsconst name = 'alice'const age = 16const hobby = 'singing'exports.name = nameexports.age = agemodule.exports = { hobby}// b.jsconst obj = require('./a.js')console.log(obj) // { hobby: 'singing' }从新将一个对象赋值给了 module.exports,module.exports 指向的内存空间曾经和 exports 不是同一个指向,所以最终的导出只有 module.exports 局部 ...

June 14, 2021 · 2 min · jiezi

关于node.js:MongoDB-只读权限设置

微信公众号:[前端一锅煮]一点技术、一点思考。问题或倡议,请公众号留言。相干命令查看本机 mongodb 版本:mongo -version 查看本机运行的 mongodb:ps aux | grep mongodb 连贯本机数据库:mongo localhost:27017 用账号密码连贯本机数据库:mongo -port 27017 -u 'admin' -p 'admin_root_test' 显示数据库列表:show dbs 切换/创立数据库:use mytest 删除以后数据库:db.dropDatabase() 创立汇合:db.createCollection('book') 显示以后所有用户:show users 删除用户:db.dropUser('myread') 杀死运行的 mongodb:kill pid 只读权限设置启动 mongodb 服务mac:mongod --dbpath /usr/local/var/mongodb --logpath /usr/local/var/log/mongodb/mongo.log --fork linux:systemctl start mongod 或 service mongod start 进入命令mongo localhost:27017 创立管理员账号use admindb.createUser({user:'admin', pwd:'admin_root_test',roles:[{ role: 'root', db: 'admin' }]})敞开 mongodbdb.adminCommand( { shutdown: 1 } ) 或者 ps -ef | grep mongodb // 查看 momgodb pidkill pid用权限认证重开mongod --auth --dbpath /usr/local/var/mongodb --logpath /usr/local/var/log/mongodb/mongo.log --fork ...

June 14, 2021 · 1 min · jiezi

关于node.js:yarn-install时node版本不一致问题

执行 “yarn install” 报如下谬误,谬误示意node版本不统一:The engine "node" is incompatible with this module. Expected version XXX 解决形式:疏忽谬误后从新yarn installyarn config set ignore-engines true

June 11, 2021 · 1 min · jiezi

关于node.js:require-方法详解

在 NodeJS 中有一个办法是咱们应用频率最高的,那就是 require 办法。NodeJs 遵循 CommonJS 标准,该标准的外围是通过 require来加载其余依赖的模块。 几个问题module.exports 或者 exports 是全局变量吗?模块的加载是同步还是异步?循环援用会不会产生性能问题或者导致谬误?什么是 CommonJS每一个文件就是一个模块,领有本人独立的作用域,变量,以及办法等,对其余的模块都不可见。CommonJS 标准规定,每个模块外部,module 变量代表以后模块。这个变量是一个对象,它的 exports 属性(即module.exports)是对外的接口。 Node 模块的分类build-in modules —— Nodejs 中以 C++ 模式提供的模块。constant module —— Nodejs 中定义常量的模块。native module —— Nodejs 中以 javascript 模式提供的模块。第三方module —— 由第三方提供的模块。module 对象NodeJs 外部提供一个 Module 构建函数。所有模块都是 Module 的实例。 每个模块外部,都有一个 module 对象,代表以后模块。它有以下属性。 module 对象的属性 module.id 模块的辨认符,通常是带有绝对路径的模块文件名。module.filename 模块的文件名,带有绝对路径。module.loaded 返回一个布尔值,示意模块是否曾经实现加载。module.parent 返回一个对象,示意调用该模块的模块(程序入口文件的module.parent为null)module.children 返回一个数组,示意该模块要用到的其余模块。module.exports 示意模块对外输入的值。module.exports 属性module.exports属性示意以后模块对外输入的接口,其余文件加载该模块,实际上就是读取module.exports变量。module.exports属性示意以后模块对外输入的接口,其余文件加载该模块,实际上就是读取module.exports变量。exports 变量咱们有时候会这么写: // test.jsfunction test(){ console.log(test);}export.test = test;// result.jsconst test = require("./test")这样也能够拿到正确的后果,这是因为:exports 变量指向 module.exports。这等同在每个模块头部,有一行这样的命令。 ...

June 10, 2021 · 2 min · jiezi

关于node.js:搭建后台环境linux搭建服务

前言搭建服务器阐明,首先你必须有本人云服务器(本地liunx主机),如果是云服务器须要一个域名。会在云服务器中装置 liunx 的 CentOS(6.8到7.9版本之间,不能应用8.0或以上)零碎。上面教程以 7.8 零碎版本为例。如果是云服务器话,那么须要一个域名,域名还得备案。请依照教程的每步进行执行,如果产生异样无奈解决,请重装系统重来吧。常见目录罕用到的目录列取出来/usr/bin 零碎预设的可执行文件,如开关机在这里,优先级最高。相当于 window的 C:\Program Files,也就是说安装程序地位都在这里了/usr/local/src 将下载的安装包等都放入到这个地位,包含解压等操作/usr/local/bin 用户自身相干的可执行文件,如本人装置的软件举荐放在这里,会晋升到全局/usr/sbin 根本同上yum 运行命令此命令是 CentOS 零碎的装置依赖管理工具,十分的好用1.列出所有可更新的软件清单命令:yum check-update2.更新所有软件命令:yum update3.仅装置指定的软件命令:yum install4.仅更新指定的软件命令:yum update5.列出所有可安裝的软件清单命令:yum list6.删除软件包命令:yum remove7.查找软件包 命令:yum search8.革除缓存命令: yum clean packages: 革除缓存目录下的软件包yum clean headers: 革除缓存目录下的 headersyum clean oldheaders: 革除缓存目录下旧的 headersyum clean, yum clean all (= yum clean packages; yum clean oldheaders) :革除缓存目录下的软件包及旧的headers【原地址】: https://lolku.cn/web/details/posts/35

June 8, 2021 · 1 min · jiezi

关于node.js:国际化文本翻译数据利用nodeJS转换成JSON文件

零碎做国际化,而后市场部给了一份中英文翻译,翻译的条目还不是奥,而且当前还可能会增加,最好就当初写个简略转换方法。 const readline = require('readline');const fs = require('fs'); async function processLineByLine() { const fileStream = fs.createReadStream('file/International.txt');const rl = readline.createInterface({ input: fileStream, crlfDelay: Infinity});// 留神:咱们应用 crlfDelay 选项将 input.txt 中的所有 CR LF 实例('\r\n')辨认为单个换行符。let num = 1, data = {}, endata = {}, active_title = '', flag = false;for await (const line of rl) { if (line != '') { if (/[一二三四五六七八九十]/g.test(line) && !/[a-z]/g.test(line)) { let title = line.substr(line.indexOf('、') + 1); switch (title) { case '首页': title = "home"; break; case '资产治理': title = "asset"; break; default: } active_title = title; data[title] = {}; endata[title] = {}; } else { let arr = line.split(':'); let key = arr[1]; key = key.replace(/'/ig, '').replace(/(^\s*)|(\s*$)/g, '').replace(/\s/g, '-').toLowerCase(); data[active_title][key] = arr[0]; endata[active_title][key] = arr[1]; } } num++;}const str_data = JSON.stringify(data), str_endata = JSON.stringify(endata);fs.writeFile('file/zh-CN.json', str_data, (err) => { if (err) throw err; console.log('国际化中文版文件已保留!');});fs.writeFile('file/en-US.json', str_endata, (err) => { if (err) throw err; console.log('国际化英文版文件已保留!');});} ...

June 8, 2021 · 2 min · jiezi

关于node.js:Mac-更新降级node版本

Mac 更新/降级node版本查看node版本号 node -v安装包n npm i -g n如果报错提醒没有权限(sudo是最大权限,须要输出明码,个别和开机明码雷同)sudo npm i -g n更新/降级 node n <版本号> // n 12.13.0sudo n <版本号>装置最新版本 n latest装置稳固版本 n lts获取n相干命令 n helpWindows 须要去官网下载最新包去更新

June 8, 2021 · 1 min · jiezi

关于node.js:HTTP请求ContentTyped的用处有哪些

1、概念 Content-Type示意内容类型和字符编码。内容类型也叫做MIME类型。是Internet Media Type,互联网媒体类型。在互联网上传输的数据有不同的数据类型,HTTP在传输数据对象时会为他们打上称为MIME的数据格式标签,用于辨别数据类型。 申请头中的content-type,就是 B端发给S端的数据类型形容 。即通知服务器端,我给你传的数据是某种类型的,服务器端针对不同类型的数据,做法过后是不雷同的。就像,咱们平时面对,人,猪,狗等不同类型的动物做法不同。见到狗,你得“汪汪汪”,见到人,你得说”您好“。 响应头中的content-type,就是 S端发给B端的数据类型形容 。即通知浏览器端,我给你发的是什么样格局的数据,那么浏览器端针对不同类型的数据,解决办法不同。 2、语法格局 不论是呈现在申请头还是响应头里,都是键值对的形式。 content-type: 值,如:Content-Type: text/html; charset=utf-8。 解释:如果在响应头里,有Content-Type: text/html; charset=utf-8。示意,我服务器端给你客户端响应的内容是html格局的内容,字符集是utf-8。 3、申请头中常见的content-type 申请头中的content-type在chrome浏览器的network里可能看到。1 1)application/x-www-form-urlencoded 在应用表单提交时,申请形式是post时,form标签的属性entry=”application/x-www-form-urlencoded“(这也是默认值),申请头中的content-type的值就是 application/x-www-form-urlencoded。同时,浏览器会主动把处于form标签里的表单元素的内容组织成键值对的形式(key1=val1&key2=val2)。其中,键 就是每个表单元素的name属性的值;值就是表单元素的value属性的值。键和值都进行了URL的转码。并放到申请实体外面。(留神如果是中文或特殊字符如"/"、","、“:" 等会主动进行URL转码)。游戏代码示例如下:2 如果应用ajax发送post申请,须要用www.diuxie.com setRequestHeader();设置content-type。代码如下: XMLHttpRequest对象.setRequestHeader("Content-type","application/x-www-form-urlencoded"); 2)multipart/form-data 这个个别应用在文件上传时。表单提交形式,申请形式是post,form标签的属性 entry="multipart/form-data",申请头中的content-type的值是: multipart/form-data; boundary=----WebKitFormBoundarybi5XUwMxC7yc9s5a。既能够上传文件等二进制数据,也能够上传表单键值对,只是最初会转化为一条信息。 示例代码:3 3)application/json 这种格局(json格局)是目前在前后端拆散开发场景中应用最多的的。前后端的数据交互应用json格局进行,可浏览性好,简介,不便。 这种格局个别用在发送ajax申请时,要么明确设置了 content-type 是application/json。要么,有的第三方库默认是application/json。如下示例代码: XMLHttpRequest对象.setRequestHeader("Content-type","application/json"); 4)text/xml 这种格局(XML格局)是比拟早的格局。当初用的比拟少了,因为XML格局的数据被json的数据大,简单。所以,基本上被淘汰了。 4、响应头中的常见的content-type 响应头中的content-type在chrome浏览器的network里可能看到。4那些存在游戏的代码源: 能够通过后端的响应对象进行设置,如php中的设置: ;5 5、前后端交互时,罕用的content-type application/json。 不论是前端给后端发送数据,还是后端给前端发送数据,最罕用的类型就是application/json。 以上就是Content-Type的介绍了,心愿能帮到大家。

June 7, 2021 · 1 min · jiezi

关于node.js:PostgreSQL获取建表语句存储过程

PG版本: PostgreSQL 11.11 存储过程: create or replace function get_tab_ddl(tab_name varchar)returns text as $$declare --定义变量tab_ddl text;curs refcursor;tmp_col record;tab_info record;begin --获取表的pid、schema信息open curs for SELECT c.oid,n.nspname,c.relname FROM pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE c.relname ~ ('^('||tab_name||')$')AND pg_catalog.pg_table_is_visible(c.oid) ORDER BY 2,3;fetch curs into tmp_col;--判断是否存在该表if tmp_col.oid is null then return 'Table "'||tab_name||'" was not queried';end if;--如表存在,获取游戏列表信息FOR tab_info IN SELECT a.attname as col_name, pg_catalog.format_type(a.atttypid, a.atttypmod) as col_type, CASE WHEN (SELECT substring(pg_catalog.pg_get_expr(d.adbin, d.adrelid) for 128) FROM pg_catalog.pg_attrdef d WHERE d.adrelid = a.attrelid AND d.adnum = a.attnum AND a.atthasdef) IS NOT NULL THEN 'DEFAULT '|| (SELECT substring(pg_catalog.pg_get_expr(d.adbin, d.adrelid) for 128) FROM pg_catalog.pg_attrdef d WHERE d.adrelid = a.attrelid AND d.adnum = a.attnum AND a.atthasdef) ELSE '' END as col_default_value, CASE WHEN a.attnotnull = true THEN 'NOT NULL' ELSE 'NULL' END as col_not_null, a.attnum as attnum, e.max_attnum as max_attnum FROM pg_catalog.pg_attribute a INNER JOIN (SELECT a.attrelid, max(a.attnum) as max_attnum FROM pg_catalog.pg_attribute a WHERE a.attnum > 0 AND NOT www.cungun.coma.attisdropped GROUP BY a.attrelid) e ON a.attrelid=e.attrelid WHERE a.attnum > 0 AND a.attrelid=tmp_col.oid AND NOT a.attisdropped ORDER BY a.attnum --拼接为ddl语句LOOP IF tab_info.attnum = 1 THEN tab_ddl:='CREATE TABLE '||tmp_col.nspname||'.'||tmp_col.relname||' ('; ELSE tab_ddl:=tab_ddl||','; END IF; IF tab_info.attnum <= tab_info.max_attnum THEN tab_ddl:=tab_ddl||chr(10)||' '||tab_info.col_name||' '||tab_info.col_type||' '||tab_info.col_default_value||' '||tab_info.col_not_null; END IF;END LOOP; tab_ddl:=tab_ddl||');';--输入后果RETURN tab_ddl;end;$$ language plpgsql;游戏列表用法: ...

June 7, 2021 · 1 min · jiezi

关于node.js:我们并不需要-Deno

作者:Deno 一出世便带着光环 —— 它公布于 Node.js 创始人 Ryan Dahl 的演讲「Design Mistakes in Node(幻灯片)」,过后有些人说 Node.js 要凉了,但我不这么认为。 原生 TypeScript 其实目前咱们在引擎的「用户态」去应用 TypeScript 并没有引入任何问题,而且给用户带来了很大的灵活性。思考到 TypeScript 不可能来到 JavaScript 的生态 —— 毕竟引擎总是要反对 JavaScript 的;再加上 TypeScript 有不同的版本、不同的编译开关,在用户态应用 TypeScript 能够说是最好的计划了。TypeScirpt 迟早会成为 Deno 的历史包袱。 从性能的角度,在 TypeScript 没呈现之前,V8 曾经在 JavaScript 上进行大量 魔法优化 了,能够说 JIT 进去的代码并不比其余动态类型的语言差太多,是没法简略地通过 TypeScript 来晋升性能的。再加上后面说了引擎总还是要反对 JavaScript、TypeScript 的运行时语义仍然是 JavaScript(TypeScript 并不能保障对象的理论类型在运行时不被批改),所以引擎也不可能从对 JavaScript 的魔法优化切换到基于 TypeScript 的类型来做优化。 包管理器 我始终认为 NPM 是最好用的包管理器之一,这包含将依赖保留在我的项目目录中 —— 在调整一个我的项目的依赖时不用放心对其余我的项目产生影响;每个包都能够指定本人的依赖版本,容许多版本并存 —— 在降级一个包的依赖时不会影响到其余包,每个包都能够应用新的版本或持续应用旧的版本;NPM 负责查找和安装包,而 Node.js 则用绝对简略的协定去应用这些包,它们能够彼此独立地降级演进。 能够看到 NPM 最终极大地加重了开发者的心智累赘,只有你依照正确的形式去应用它,极少会遇到其余语言中无关依赖治理的问题。而 Deno 则反其道行之。尽管 Deno 也提供了一些相干的性能(deno cache),但你会发现 Deno 的本意依然是不心愿进行「依赖治理」。 ...

June 4, 2021 · 1 min · jiezi

关于node.js:深入浅出Nodejs一-模块机制

模块分类Node.js有两种模块 外围模块局部外围模块曾经被间接加载进内存中,路径分析 编译执行的步骤能够省略 并且在路径分析中优先被判断,所以加载速度最快文件模块运行时动静加载,所以须要残缺的路径分析 文件定位和 编译执行过程,所以速度比外围模块慢实现“模块”性能的奥秘就在于JavaScript是一种函数式编程语言,它反对闭包。如果咱们把一段JavaScript代码用一个函数包装起来,这段代码的所有“全局”变量就变成了函数外部的局部变量。 var s = 'Hello';var name = 'world';console.log(s + ' ' + name + '!');(function() { var s = 'Hello'; var name = 'world'; console.log(s + ' ' + name + '!');})()这样一来,原来的全局变量s当初变成了匿名函数外部的局部变量。如果Node.js持续加载其余模块,这些模块中定义的“全局”变量s也互不烦扰。 所以,Node利用JavaScript的函数式编程的个性,轻而易举地实现了模块的隔离。 模块缓存机制Nodejs对加载过的模块 会进行缓存,以缩小二次引入时的开销,引入模块时会优先从缓存中查找,Node缓存的是编译和执行之后的对象 缓存模式: key-value的模式,以实在门路作为key,以编译执行后的后果作为value 放在缓存中(Module._cache对象中)(二次加载速度更快)打印rquire.cache 能够看到缓存的对象 模块的循环援用先说论断,因为Node.js会缓存加载过的模块,所有模块的循环依赖并不会引起有限循环援用。举个例子: a.js文件下 console.log('a starting');exports.done = falseconst b = require('./b.js')console.log('in a, b done = %j', b.done);exports.done = trueconsole.log('a done');b.js文件下 console.log('b starting');exports.done = false// 这里导入的是a未执行完的正本const a = require('./a.js')console.log('in b, a done = %j', a.done);exports.done = trueconsole.log('b done');main.js文件下 ...

June 4, 2021 · 2 min · jiezi

关于node.js:Spring-Boot中的一些常用配置介绍

这篇教程将为你介绍Spring Boot 中的一些罕用配置,比方:自定义 Banner、配置日志、敞开特定的主动配置等。 自定义 Banner 在 Spring Boot 启动的时候会有一个默认的启动图案,被称为Banner。 默认的Banner成果如下:默认 这个Banner是Spring Boot自带的,如果咱们感觉不难看,是能够更改的,作为一个资深的码农,怎么能够不定制一个本人的Banner呢? 新建一个banner.txt 咱们在 src/main/resources 目录下新建一个 banner.txt 咱们只须要将想要显示的字符串放到这个文件外面即可。 罕用Banner设置属性 ${AnsiColor.BRIGHT_RED}: 设置控制台中输入内容的色彩; ${application.version}:用来获取 MANIFEST.MF 文件中的版本号; ${application.formatted-version}: 格式化后的 ${application.version} 游戏版本信息; ${spring-boot.version}: Spring Boot 的版本号; ${spring-boot.formatted-version}: 格式化后的 ${spring-boot.version} 版本信息banner属性 Banner其余配置 咱们能够在application.properties中,进行一些banner的根本属性配置。 咱们在src/main/resources目录下,创立一个www.cungun.comapplication.properties配置文件,在该文件中能够增加如下配置信息:banner其余配置 这些配置信息,次要是对banner的宽度高度等属性进行设置。 敞开Banner 如果咱们不想启动我的项目的时候展现Banner,也能够敞开掉,毕竟这货色没啥作用,典型的属于奇技淫巧。 1.代码形式敞开 咱们能够在Application入口类中设置Banner的启动模式,默认是开启的,能够敞开掉游戏代码敞开 通过调用setBannerMode()办法,能够设置将banner打印console,log,或者不输入off。 2.yml文件配置 咱们也能够在yml文件中,设置banner的模式,留神在yml文件中,会将off映射为false,并且须要给off增加括号:yml 3.配置形式敞开 这种形式就不必每次都写代码了,能够在每个我的项目的Edit Configurations中的spring boot选型里,找到Hide Banner,勾选,就能够敞开了!

June 4, 2021 · 1 min · jiezi

关于node.js:每日灵魂一问浅谈nodejs中的process

processprocess是node.js的全局对象,不须要应用require()加载即可应用process模块次要做两方面的事件1.获取过程信息(资源应用、运行环境、运行状态、三个规范输入输出流)2.执行过程操作(监听事件、调度工作、收回正告、退出过程)1.获取过程信息(资源应用、运行环境、运行状态)1.1获取过程信息-资源应用:指运行此过程所耗费的机器资源 process.memoryUsage() 内存 process.cpuUsage() cpu1.2获取过程信息-运行环境 process.cwd()运行目录 process.version 获取node环境 process.arch 获取CPU架构 process.env.NODE_ENV 获取用户环境 辨别development 和 production process.platform 零碎平台 process.uptime()曾经运行的秒1.3获取过程信息-运行状态 process.argv 能够获取传入的命令行参数,返回值是一个数组 process.execArgv 返回node非凡(node-specific) 的命令行参数 process.execPath 绝对路径 process.mainModule 判断是否是主文件 1.4获取过程信息-规范输入输出流 process.stdout 规范输入 process.stdin 规范输出 process.stderr 规范谬误输入2.执行过程操作(监听事件、调度工作、收回正告)2.1执行过程操作-监听事件 process.on() process.on(‘beforeExit’,cb) 外面能够执行异步代码 process.on(‘exit’,cb)执行同步代码 process.on(‘uncaughtException’,cb) 捕捉异样信息(没有try catch的异样信息)2.2执行过程操作-调度工作process.nextTick(fn) process.nextTick(fn)把回调函数作为微工作,放入事件循环的工作队列中2.3执行过程操作-收回正告 process.emitWarning('Something warning happened!', { code: 'MY_WARNING', type: 'XXXX' });2.4执行过程操作-退出过程 process.abort() process.exit([code])终止以后过程并返回给定的 code process.kill(pid, [signal])完结对应某pid的过程并发送一个信号

June 3, 2021 · 1 min · jiezi

关于node.js:每日灵魂一问nodejs的全局变量有哪些

1.global 示意node.js的全局运行环境(JavaScript 中,通常 window 是全局对象, 而 Node.js 中的全局对象是 global)2.process 示意node.js的过程状态3.console 用于控制台的输入4.Class:Buffer 能够解决二进制以及非Unicode编码的数据 5.全局的函数:setTimeout setInterval clearTimeout cleatSetInterval 6.全局的变量_fileName 获取文件的门路_dirname 获取脚本所在的目录 7.伪全局变量:模块外部的局部变量,指向的对象依据模块不同而不同,然而所有模块都实用,能够看作是伪全局变量,次要为module, exports, require等。

June 2, 2021 · 1 min · jiezi

关于node.js:Nodejs-性能优化

微信公众号:[前端一锅煮]一点技术、一点思考。问题或倡议,请公众号留言。Node.js 作为后盾服务性能是十分要害的一点,而影响 Node.js 的性能不仅仅要思考其自身的因素,还应该思考所在服务器的一些因素。比方网络 I/O 、磁盘 I/O 以及其余内存、句柄等一些问题。上面将具体地剖析影响其性能的因素起因,以及局部优化解决方案。 CPU 密集型计算CPU 负责了程序的运行和业务逻辑的解决,而 CPU 密集型示意的次要是 CPU 承载了比较复杂的运算。 在 Node.js 中因为主线程是单线程的,无论是主线程逻辑,还是回调解决逻辑,最终都是在主线程解决,那么如果该线程始终在解决简单的计算,其余申请就无奈再次进来,也就是单个用户就能够阻塞所有用户的申请。这样就会因为某些用户的简单运算,而影响到整个零碎的申请解决,而且这种简单运算占用的 CPU 工夫越久,就会导致申请沉积,而进一步导致系统处于解体状态无奈复原。因而放弃主线程的通顺是十分要害的。 在 Node.js 中有以下几种状况,会影响到主线程的运行,应被动防止: 大的数据循环,比方没有利用好数据流,一次性解决十分大的数组;字符串解决转化,比方加解密、字符串序列化等;图片、视频的计算解决,比方对图片进行裁剪、缩放或者切割等。对此咱们思考以下优化方向: 将 CPU 密集型计算应用其余过程来解决;减少缓存,对于雷同响应的返回数据,减少缓存解决,防止不必要的反复计算。本地磁盘 I/OI/O(Input/Output)意思是输入输出,其实就是数据传递的一个过程,作为后盾服务须要更多地与内部进行数据交互,那么就免不了 I/O 操作。 I/O 分为以下 5 种模型,在介绍分类之前,咱们先理解 I/O 在零碎层面会有 2 个阶段(以读为例子): 第一个阶段是读取文件,将文件放入操作系统内核缓冲区;第二阶段是将内核缓冲区拷贝到应用程序地址空间。阻塞 I/O例如读取一个文件,咱们必须要期待文件读取实现后,也就是实现下面所说的两个阶段,能力执行其余逻辑,而以后是无奈开释 CPU 的,因而无奈去解决其余逻辑。 非阻塞 I/O非阻塞的意思是,咱们发动了一个读取文件的指令,零碎会返回正在解决中,而后这时候如果要开释过程中的 CPU 去解决其余逻辑,你就必须距离一段时间,而后不停地去询问操作系统,应用轮询的判断办法看是否读取实现了。 多路复用 I/O这一模型次要是为了解决轮询调度的问题,咱们能够将这些 I/O Socket 解决的后果对立交给一个独立线程来解决,当 I/O Socket 解决实现后,就被动通知业务,解决实现了,这样不须要每个业务都来进行轮询查问了。 它包含目前常见的三种类型:select 、poll 和 epoll。首先 select 是比拟旧的,它和 poll 的区别在于 poll 应用的是链表来保留 I/O Socket 数据,而 select 是数组,因而 select 会有下限 1024,而 poll 则没有。select、poll 与 epoll 的区别在于,前两者不会通知你是哪个 I/O Socket 实现了,而 epoll 会告诉具体哪个 I/O Socket 实现了哪个阶段的操作,这样就不须要去遍历查问了。 ...

May 30, 2021 · 2 min · jiezi

关于node.js:五分钟开发属于你自己的代码生成器

本文很短,却诚意满满 用不了2分钟你就能看完 而后大概率你就会惊叹 原来开发属于本人的代码生成器,是这么滴简略舒适提醒:本文是《新生代小鲜肉之代码生成器》的连续篇,如果你还不晓得 ncgen 这个小鲜肉,那最好先去 Look 一 Look 《新生代小鲜肉之代码生成器》 丹尼尔:蛋兄,上次别后,依照你教我的那一套办法,我几分钟就配置了一个齐全满足我需要的代码生成器,真是弱小又不失简略啊 蛋学生:说干就干,你的入手能力让我拜服 丹尼尔:见笑见笑。不过我明天又带着问题而来 蛋学生:恭候多时 丹尼尔:我把 ncgen-config.js 挂在了云端,而后我的小伙伴们埋怨应用的时候命令太长记不住: $ ncgen https://raw.githubusercontent.com/daniel-dx/vue3-ncgen-demo/master/ncgen-config.js你看,是不是有点长?蛋兄有什么好倡议吗? 蛋学生:当然,ncgen 早已为此筹备了一个十分迷人的计划 丹尼尔:什么迷人的计划?有多迷人?快通知我快通知我 蛋学生:那就是 - 通过 ncgen 疾速开发属于你本人的代码生成器 丹尼尔:Wo~,属于我本人的,听着就爽歪歪,昨弄呢?昨弄呢? 蛋学生:假如咱们当初要开发一个代码生成器,就叫 vue-ncgen-demo-cli 吧,你猜几步搞定? 丹尼尔:我猜啊,就一步。 蛋学生:这,有点过分了,臣妾做不到,再见 丹尼尔:玩笑玩笑,蛋兄就直说吧 蛋学生:那就三步曲走起 第一步:生成代码生成器我的项目$ yarn create @ncgen/app # npm init @ncgen/app 第二步:编写代码生成器逻辑在生成的我的项目中找到 ncgen-config.js ,依据你代码生成器的逻辑,批改这个配置文件 示例配置在这里:https://github.com/daniel-dx/...这里举荐一个小技巧,在须要减少子命令时,除了复制粘贴,其实你是能够更优雅地通过子命令的形式来实现的 cd vue-ncgen-demo-cli$ yarn create @ncgen/app add-sub # # npm init @ncgen/app add-sub 第三步:对全世界公布$ npm run release丹尼尔:完了? 蛋学生:是的,完了,就是这么简略 丹尼尔:那我的小伙伴们该如何应用这个代码生成器呢? 蛋学生:灰常简略,示例走起 # 装置$ npm i vue-ncgen-demo-cli -g# 执行主命令生成脚手架我的项目$ vue-ncgen-demo-cli# 执行子命令插入代码$ vue-ncgen-demo-cli add-component丹尼尔:完满,我急不可待地想要去开发属于我本人的代码生成器了 ...

May 30, 2021 · 1 min · jiezi

关于node.js:nodejs-实现文件上传

需要:在做nodejs + express + vue博客我的项目时须要实现图片上传到后盾和删除的性能,这里做一个记录。 nodejs 实现图片上传// 导入express框架const express = require('express')const multer=require('multer');const path=require('path');const fs=require('fs');// 创立路由const upload = express.Router()var Multer=multer({dest: './public/uploads'}); //设置上传的的图片保留目录// 示意接管任何上传的数据 对应的有个 upload.single('user') 示意只接管name为user的上传数据upload.use(Multer.any());upload.post('/images',(req,res)=> { // 带后缀的门路 const newpath = req.files[0].path + path.parse(req.files[0].originalname).ext // 带后缀的文件名 const newname = req.files[0].filename + path.parse(req.files[0].originalname).ext // 重命名文件名 fs.rename(req.files[0].path,newpath,err=>{ if(err) return res.send({ "data": null, "meta": { "msg": "文件上传失败!", "status": 400 } }) }) res.send({ "data": newname, "meta": { "msg": "文件上传胜利!", "status": 201 } })})// 将路由对象作为模块成员进行导出module.exports = uploadnodejs 实现图片删除// 导入express框架const express = require('express')const path=require('path');const fs=require('fs');// 创立路由const deleteImg = express.Router()deleteImg.delete('/deleteImg/:name',(req,res)=> { // 删除图片 const name = req.params.name fs.unlink('./public/uploads/' + req.params.name, err=> { if(err) return res.send({ "data": null, "meta": { "msg": "删除失败", "status": 400 } }) }) res.send({ "data": null, "meta": { "msg": "删除胜利", "status": 200 } })})module.exports = deleteImgvue 实现图片上传<template><!-- 图片上传 --> <el-upload class="avatar-uploader" action="http://127.0.0.1:8889/images" :show-file-list="false" :on-success="handleAvatarSuccess" :before-upload="beforeAvatarUpload" > <img v-if="imageUrl" :src="imageUrl" class="avatar" /> <i v-else class="el-icon-plus avatar-uploader-icon"></i> </el-upload></template><script>export default { data () { return { // 提交文章数据 article: { title: '', author: '', cover: '', content: '', sort: '' }, imageUrl: '' } }, methods: { // 抉择文章封面 async handleAvatarSuccess (res, file) { // 删除之前的图片 await this.$http.delete(`/deleteImg/${this.article.cover}`) // 获取图片文件名 this.article.cover = res.data }, // 上传图片之前 beforeAvatarUpload (file) { // 图片预览 this.imageUrl = URL.createObjectURL(file) } }}</script>

May 28, 2021 · 1 min · jiezi

关于node.js:Stimulsoft-Reports如何创建新的数据转换编辑数据转换

Stimulsoft Reports.Net是一个基于.NET框架的报表生成器,可能帮忙你创立构造、功能丰富的报表。 StimulReport.Net 的报表设计器不仅界面敌对,而且应用便捷,可能让你轻松创立所有报表;该报表设计器在报表设计过程中以及报表运行的过程中都能够应用。在运行时应用StimulReport.Net 的报表设计器不须要领取任何的专利费用。 所创立的报表既能够在Windows窗体应用程序中应用,也能够在Asp.Net应用程序中应用。可导出多种数据格式,比方:PDF,XML,HTML,Word,Excel,RTF格局,文本文件,CSV,BMP和JPEG格局,GIF,PNG,TIFF格局等。创立新的数据转换;编辑数据转换;创立新的数据转换 步骤1 :运行报表设计器; 步骤2 :转到数据字典; 步骤3:连贯数据; 步骤4 :单击“新建我的项目”按钮,而后抉择“新建数据转换”命令; eac453aabd1640b56929b7b57f92724a.png 步骤5 :将数据列从源拖动到数据转换编辑器。 05f7867ea7e8dbad75768deb19a3ecdf.png 当从各种起源增加数据列以进行数据关系时,必须在这些起源之间设置关系。如www.sangpi.com一样能够设置关系‘’ 步骤6:设置数据列-更改值的类型,将数据分组,将性能利用于值,过滤,对数据进行排序,替换值,计算运行总额,显示值的百分比,跳过并设置行限度。 16fb3004b9c2ccebf8a8a8f690c487c5.png 步骤7 :在New Data Transformation窗口中单击OK 。 当初,基于此数据转换,您能够创立报告或仪表板。 编辑数据转换 另外,您能够编辑创立的数据转换。 步骤1 :在报告字典中抉择现有的游戏数据转换; 步骤2:单击数据字典工具栏上的“编辑”按钮; 1b8337a46485fa9bc28a8d1fcf086b10.png 步骤3:编辑数据转换; 步骤4 :在“编辑数据转换”窗口中单击“确定” 。

May 27, 2021 · 1 min · jiezi

关于node.js:pinus-前端服务器向后端服务器发送消息

pinus的我的项目框架和pomelo是一样的,感激pinus的项目组,这个服务器框架失去了倒退。不同类之间的关系简单,这篇文章没有要梳理其中的关系的内容,只是针对前端服务器向后端服务器发送音讯的过程参考相干代码做个介绍。 客户端向服务器发送音讯客户端连贯服务器框架的时候会生成一个socket对象,socket对象注册一些事件,这部分代码在pinus/common/components/connector.ts文件里。客户端向服务器发送会触发messege事件。以下是messege的响应 // new message socket.on('message', (msg) => { let dmsg = msg; // if (this.useAsyncCoder) { // return this.handleMessageAsync(msg, session, socket); // } if (this.decode) { dmsg = this.decode(msg); } else if (this.connector.decode) { dmsg = this.connector.decode(msg); // Perhaps protobuf decoder error can be captured here. // if (dmsg && dmsg.body === null) { // // protobuf decode error // logger.error('fail to decode the msg body received from client. msg:', dmsg); // return; // } } if (!dmsg) { // discard invalid message return; } // use rsa crypto if (this.useCrypto) { let verified = this.verifyMessage(session, dmsg); if (!verified) { logger.error('fail to verify the data received from client.'); return; } } this.handleMessage(session, dmsg); }); // on message end办法调用this.server.globalHandle这个办法向后端服务器发送音讯最初调用 this.handleMessage(session, dmsg)这个办法将音讯返回给客户端 ...

May 27, 2021 · 1 min · jiezi

关于node.js:Nodejs环境配置Npm切换

后期筹备 1、Node.js简介简略的说 Node.js 就是运行在服务端的 JavaScript。Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。Node.js 应用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。Node.js 的包管理器 npm,是寰球最大的开源库生态系统。2、下载Node.js我这里下载的是node-v11.3.0-x64.msi。 开始装置 1、下载实现后,双击“node-v11.3.0-x64.msi”,开始装置Node.js image 一路点击【Next】按钮,其中装置目录自行抉择(不倡议装在C盘) 至此Node.js曾经装置实现,能够先进行下简略的测试装置是否胜利了,前面还要进行环境配置在键盘按下【win+R】键,输出cmd,而后回车,关上cmd游戏窗口 此处阐明下:新版的Node.js已自带npm,装置Node.js时会一起装置,npm的作用就是对Node.js依赖的包进行治理,也能够了解为用来装置/卸载Node.js须要装的货色 环境配置 阐明:这里的环境配置次要配置的是npm装置的全局模块所在的门路,以及缓存cache的门路,之所以要配置,是因为当前在执行相似:npm install express [-g] (前面的可选参数-g,g代表global全局装置的意思)的装置语句时,会将装置的模块装置到【C:\Users\用户名\AppData\Roaming\npm】门路中,占C盘空间。 创立完两个空文件夹之后,关上cmd命令窗口,输出 npm config set prefix "D:\Develop\nodejs\node_global"npm config set cache "D:\Develop\nodejs\node_cache"、 测试 配置完后,倡议更换下npm镜像源,起因:因为node装置插件是从国外服务器下载,受网络影响大,速度慢且可能出现异常。所以如果npm的服务器在中国就好了,例如:www.sangpi.com也就是说咱们能够应用安排在国内的服务器来进行node装置。同理,在cmd命令下输出 : npm config set registry --globalnpm config set disturl --global 最初装置个module测试下,咱们就装置最罕用的express模块,关上cmd窗口,输出如下命令进行模块的全局装置: npm install express -g # -g是全局装置的意思

May 27, 2021 · 1 min · jiezi

关于node.js:控制反转Ioc依赖注入DI如何实现的

牛顿曾说:如果说我看得比他人更远些,那是因为我站在伟人的肩膀上。浏览优质框架库的源码,能学到不少,更有甚者基于此发明了更优良的,大抵就是如此。 midwayjs 曾经忘了是怎么意识它的了。印象中是个 nodejs 的优质框架,看了介绍,很厉害!!! Midway - 一个面向未来的云端一体 Node.js 框架<img src="/img/bVcR2g3" alt="midwayjs"> 好不好用,用过才晓得。一边浏览应用文档,一边建个本地我的项目感受一下。用着真的是很“高效”呢。 midway 外围 ”依赖注入“ 代码写法默认应用 egg 作为下层框架(反对是 express, koa),这么创立我的项目: $ npm -v# 如果是 npm v6$ npm init midway --type=web hello_koa# 如果是 npm v7$ npm init midway -- --type=web hello_koa应用: controller/api.ts import { Inject, Controller, Get, Provide, Query } from '@midwayjs/decorator';import { Context } from 'egg';import { UserService } from '../service/user';@Provide()@Controller('/api')export class APIController { @Inject() ctx: Context; @Inject() userService: UserService; @Get('/get_user') async getUser(@Query() uid) { const user = await this.userService.getUser({ uid }); return { success: true, message: 'OK', data: user }; }}service/user.js ...

May 16, 2021 · 9 min · jiezi

关于node.js:vue组件库用vuecli构建typescript版UI库-安装常用npm包配置脚本

装置罕用npm包、配置脚本 1. 删除文件和文件夹 rimraf 作用以包的模式包装rm -rf命令,用来删除文件和文件夹,不论文件夹是否为空,都能够删除。 npm:https://www.npmjs.com/package...github: https://github.com/isaacs/rimraf装置# npm装置$ npm install rimraf --D# yarn装置$ yarn add rimraf -D应用在package.json scripts中应用 "clean": "rimraf dist" //删除dist文件夹 构建工具中应用 这个包只提供一个办法:rimraf(f, [opts], callback) const rimraf = require('rimraf');rimraf('./a.txt', function (err) { // 删除当前目录下的 a.txt console.log(err);});

May 11, 2021 · 1 min · jiezi

关于node.js:Nodejs-入门就是运行在服务端的-JavaScript

简介Node.js 是一个基于Chrome JavaScript 运行时建设的一个平台。 Node.js是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎,V8引擎执行Javascript的速度十分快,性能十分好。 简略的说 Node.js 就是运行在服务端的 JavaScript。 具体学习: 菜鸟教程 一、疾速入门Hello World新建js文件 helloworld.js console.log("hello world!");终端执行文件(需在文件所在目录下执行) node helloworld.js实现繁难HttpServer新建js文件server.js var http = require('http');http.createServer(function (request, response) { // 发送 HTTP 头部 // HTTP 状态值: 200 : OK // 内容类型: text/plain response.writeHead(200, {'Content-Type': 'text/plain'}); // 发送响应数据 "Hello World" response.end('Hello World\n');}).listen(8888);// 终端打印如下信息console.log('Server running at http://127.0.0.1:8888/');终端执行文件(需在文件所在目录下执行) node server.js 敞开nodejs服务 在终端按Ctrl+C二、NPM包管理器1. 根本信息简介,这篇Node.js 包管理器 NPM 解说文章解说具体,点击就可浏览NPM官方网站 NPM是伴随NodeJS一起装置的包管理工具,能解决NodeJS代码部署上的很多问题,常见的应用场景有以下几种: 容许用户从NPM服务器下载他人编写的第三方包到本地应用。容许用户从NPM服务器下载并装置他人编写的命令行程序到本地应用。容许用户将本人编写的包或命令行程序上传到NPM服务器供他人应用。查看装置因为新版的nodejs曾经集成了npm,所以之前npm也一并装置好了。能够通过输出 "npm -v" 来测试是否胜利装置,呈现版本提醒示意装置胜利。 $ npm -v2.3.0npm 降级Linux零碎环境降级 $ sudo npm install npm -gWindows零碎环境降级 ...

May 10, 2021 · 3 min · jiezi

关于node.js:Nodejs-多进程

微信公众号:[前端一锅煮]一点技术、一点思考。问题或倡议,请公众号留言。Node.js 主线程是单线程的,如果咱们应用 node app.js 形式运行,就启动了一个过程,只能在一个 CPU 中进行运算,无奈应用服务器的多核 CPU。为了解决这个问题,咱们能够应用多过程散发策略,即主过程接管所有申请,而后通过肯定的负载平衡策略散发到不同的 Node.js 子过程中。 这一实现有 2 种不同的计划: 主过程监听一个端口,子过程不监听端口,主过程通过负载平衡技术散发申请到子过程;主过程和子过程别离监听不同端口,通过主过程散发申请到子过程。第一种计划多个 Node 过程去监听同一个端口,益处是过程间通信绝对简略、缩小了端口的资源节约,然而这个时候就要保障服务过程的稳定性,特地是对 Master 过程稳定性要求会更高,编码也会简单。 第二种计划存在的问题是占用多个端口,造成资源节约,因为多个实例是独立运行的,过程间通信不太好做,益处是稳定性高,各实例之间无影响。 在 Node.js 中自带的 Cluster 模块应用的是第一种计划。 cluster 模式cluster 模式其实就是一个主过程和多个子过程,从而造成一个集群的概念。咱们先来看看 cluster 模式的利用例子。 先实现一个简略的 app.js,代码如下: const http = require('http');const cluster = require('cluster');const instances = 2; // 启动过程数量if (cluster.isMaster) { for (let i = 0; i < instances; i++) { // 应用 cluster.fork 创立子过程 cluster.fork(); }} else { // 创立 http 服务,简略返回 const server = http.createServer((req, res) => { res.write(`hello world, start with cluster ${process.pid}`); res.end(); }); // 启动服务 server.listen(8000, () => { console.log('server start http://127.0.0.1:8000'); }); console.log(`Worker ${process.pid} started`);}首先判断是否为主过程: ...

May 10, 2021 · 2 min · jiezi

关于node.js:Linux-上安装-Nodejs

间接应用已编译好的包Node 官网曾经把 linux 下载版本更改为已编译好的版本了,咱们能够间接下载解压后应用: node.js官网下载地址 # wget https://nodejs.org/dist/v14.16.1/node-v14.16.1-linux-x64.tar.xz // 下载# tar xf node-v14.16.1-linux-x64.tar.xz // 解压# cd node-v14.16.1-linux-x64/ // 进入解压目录# ./bin/node -v // 执行node命令 查看版本v14.16.1解压文件的 bin 目录底下蕴含了 node、npm 等命令,咱们能够应用 ln 命令来设置软连贯: # ln -s /usr/local/src/node-v14.16.1-linux-x64/bin/node /usr/bin/node# node -vv14.16.1# ln -s /usr/local/src/node-v14.16.1-linux-x64/bin/npm /usr/bin/npm# npm -v6.14.12

May 10, 2021 · 1 min · jiezi

关于node.js:前端面试每日-31-第755天

明天的知识点 (2021.05.10) —— 第755天 (我也要出题)[html] 写一个书本翻页的特效[css] 如果一个交互有多种办法能够做到,你是基于什么起因抉择哪种办法的?[js] 写一个办法将2021-05-07 04:30:21转换为工夫戳[软技能] 你有本人的集体网站吗?《论语》,曾子曰:“吾日三省吾身”(我每天屡次检查本人)。前端面试每日3+1题,以面试题来驱动学习,每天提高一点!让致力成为一种习惯,让奋斗成为一种享受!置信 保持 的力量!!! 欢送在 Issues 和敌人们一起探讨学习! 我的项目地址:前端面试每日3+1【举荐】欢送跟 jsliang 一起折腾前端,零碎整顿前端常识,目前正在折腾 LeetCode,打算买通算法与数据结构的任督二脉。GitHub 地址 微信公众号欢送大家前来探讨,如果感觉对你的学习有肯定的帮忙,欢送点个Star, 同时欢送微信扫码关注 前端剑解 公众号,并退出 “前端学习每日3+1” 微信群互相交换(点击公众号的菜单:交换)。 学习不打烊,充电加油只为遇到更好的本人,365天无节假日,每天早上5点纯手工公布面试题(死磕本人,愉悦大家)。心愿大家在这虚夸的前端圈里,放弃沉着,保持每天花20分钟来学习与思考。在这变幻无穷,类库层出不穷的前端,倡议大家不要等到找工作时,才狂刷题,提倡每日学习!(不忘初心,html、css、javascript才是基石!)欢送大家到Issues交换,激励PR,感激Star,大家有啥好的倡议能够加我微信一起交换探讨! 心愿大家每日去学习与思考,这才达到来这里的目标!!!(不要为了谁而来,要为本人而来!)交换探讨欢送大家前来探讨,如果感觉对你的学习有肯定的帮忙,欢送点个[Star]

May 10, 2021 · 1 min · jiezi

关于node.js:前端面试每日-31-第752天

明天的知识点 (2021.05.07) —— 第752天 (我也要出题)[html] 应用html+css画出你心中夏天的感觉[css] 在Less中,命名空间和拜访器有什么作用?[js] RegExp如何做到不辨别大小写?[软技能] 你了解的职场软技能有哪些?《论语》,曾子曰:“吾日三省吾身”(我每天屡次检查本人)。前端面试每日3+1题,以面试题来驱动学习,每天提高一点!让致力成为一种习惯,让奋斗成为一种享受!置信 保持 的力量!!! 欢送在 Issues 和敌人们一起探讨学习! 我的项目地址:前端面试每日3+1【举荐】欢送跟 jsliang 一起折腾前端,零碎整顿前端常识,目前正在折腾 LeetCode,打算买通算法与数据结构的任督二脉。GitHub 地址 微信公众号欢送大家前来探讨,如果感觉对你的学习有肯定的帮忙,欢送点个Star, 同时欢送微信扫码关注 前端剑解 公众号,并退出 “前端学习每日3+1” 微信群互相交换(点击公众号的菜单:交换)。 学习不打烊,充电加油只为遇到更好的本人,365天无节假日,每天早上5点纯手工公布面试题(死磕本人,愉悦大家)。心愿大家在这虚夸的前端圈里,放弃沉着,保持每天花20分钟来学习与思考。在这变幻无穷,类库层出不穷的前端,倡议大家不要等到找工作时,才狂刷题,提倡每日学习!(不忘初心,html、css、javascript才是基石!)欢送大家到Issues交换,激励PR,感激Star,大家有啥好的倡议能够加我微信一起交换探讨! 心愿大家每日去学习与思考,这才达到来这里的目标!!!(不要为了谁而来,要为本人而来!)交换探讨欢送大家前来探讨,如果感觉对你的学习有肯定的帮忙,欢送点个[Star]

May 7, 2021 · 1 min · jiezi

关于node.js:前端面试每日-31-第750天

明天的知识点 (2021.05.05) —— 第750天 (我也要出题)[html] 写一个微信静止排行榜页面的布局[css] 写一个办法将多个数组合并成一个数组[js] 写一个办法,给定AB两个数,判断A是否蕴含于B[软技能] 你本人有封装过哪些组件吗?说说看《论语》,曾子曰:“吾日三省吾身”(我每天屡次检查本人)。前端面试每日3+1题,以面试题来驱动学习,每天提高一点!让致力成为一种习惯,让奋斗成为一种享受!置信 保持 的力量!!! 欢送在 Issues 和敌人们一起探讨学习! 我的项目地址:前端面试每日3+1【举荐】欢送跟 jsliang 一起折腾前端,零碎整顿前端常识,目前正在折腾 LeetCode,打算买通算法与数据结构的任督二脉。GitHub 地址 微信公众号欢送大家前来探讨,如果感觉对你的学习有肯定的帮忙,欢送点个Star, 同时欢送微信扫码关注 前端剑解 公众号,并退出 “前端学习每日3+1” 微信群互相交换(点击公众号的菜单:交换)。 学习不打烊,充电加油只为遇到更好的本人,365天无节假日,每天早上5点纯手工公布面试题(死磕本人,愉悦大家)。心愿大家在这虚夸的前端圈里,放弃沉着,保持每天花20分钟来学习与思考。在这变幻无穷,类库层出不穷的前端,倡议大家不要等到找工作时,才狂刷题,提倡每日学习!(不忘初心,html、css、javascript才是基石!)欢送大家到Issues交换,激励PR,感激Star,大家有啥好的倡议能够加我微信一起交换探讨! 心愿大家每日去学习与思考,这才达到来这里的目标!!!(不要为了谁而来,要为本人而来!)交换探讨欢送大家前来探讨,如果感觉对你的学习有肯定的帮忙,欢送点个[Star]

May 5, 2021 · 1 min · jiezi

关于node.js:CabloyJS终于推出了在线演示站点欢迎拍砖

为了不便大家疾速体验和理解CabloyJS的格调和个性,全新部署了一套演示站点。对于首次接触CabloyJS的开发者,不必下载新建我的项目,就能够间接体验CabloyJS了。欢送大家拍砖 为何当初才推出为了提供更好的性能,演示站点须要在生产环境部署运行,而生成环境不宜蕴含测试模块CabloyJS新版减少了禁用模块的机制,从而容许咱们灵便管制是否须要禁止某些模块的加载和运行在默认状况下,生产环境中测试模块都是禁用的,能够通过批改如下配置项,从而为演示目标而放开{project}/src/backend/config/config.prod.js // disabledModules config.disabledModules = [ // 'test-dingtalk', // 'test-flow', // 'test-hostsimple', // 'test-localeone', // 'test-localetwo', // 'test-party', // 'test-partymonkey', // 'test-wechat', // 'test-wxwork', ]; // modules config.modules = { 'a-base': { configFront: { demo: { enable: true, }, }, }, };名称阐明disabledModules指定哪些模块被禁止加载configFront.demo.enable开启演示模式,从而某些零碎性能在演示模式下容许查看、禁止批改在线演示场景链接/二维码PC端https://test.cabloy.com/Mobile端账号类型名称明码管理员admin123456普通用户tom123456普通用户jane123456相干链接官网: https://cabloy.com/GitHub: https://github.com/zhennann/cabloy

May 1, 2021 · 1 min · jiezi

关于node.js:NodeJS-中的-LRU-缓存CLOCK2hand实现

转载请注明出处:葡萄城官网,葡萄城为开发者提供业余的开发工具、解决方案和服务,赋能开发者。在文章的开始咱们须要理解什么是缓存?缓存是事后依据数据列表筹备一些重要数据。 没有缓存的话,零碎的吞吐量就取决于存储速度最慢的数据,因而放弃应用程序高性能的一个重要优化就是缓存。 web应用程序中有两项很重要的工作,别离是文件和视频Blob的缓存和快速访问页面模板。而在NodeJS中,非异步性能操作的提早会决定零碎什么时候为其余客户端提供服务,只管操作系统有本人的文件缓存机制,然而同一个服务器中有多个web应用程序同时运行,且其中一个利用正在传输大量视频数据的时候,其余利用的缓存内容就可能会频繁生效,此时程序效率会大幅升高。 而针对应用程序资源的LRU算法能无效解决这个问题,使应用程序不被同一服务器中的其余应用程序缓存所影响。思考到存储速度最慢数据决零碎吞吐量的这一点,LRU缓存的存在能将零碎性能进步2倍至100倍;同时,异步LRU会暗藏全副高速缓存未命中的提早。 接下来咱们一起来看具体实现的内容。 代码展现首先构建一个用来结构LRU对象模块的文件:'use strict';let Lru = function(cacheSize,callbackBackingStoreLoad,elementLifeTimeMs=1000){ let me = this; let maxWait = elementLifeTimeMs; let size = parseInt(cacheSize,10); let mapping = {}; let mappingInFlightMiss = {}; let buf = []; for(let i=0;i<size;i++) { let rnd = Math.random(); mapping[rnd] = i; buf.push({data:"",visited:false, key:rnd, time:0, locked:false}); } let ctr = 0; let ctrEvict = parseInt(cacheSize/2,10); let loadData = callbackBackingStoreLoad; this.get = function(key,callbackPrm){ let callback = callbackPrm; if(key in mappingInFlightMiss) { setTimeout(function(){ me.get(key,function(newData){ callback(newData); }); },0); return; } if(key in mapping) { // RAM speed data if((Date.now() - buf[mapping[key]].time) > maxWait) { if(buf[mapping[key]].locked) { setTimeout(function(){ me.get(key,function(newData){ callback(newData); }); },0); } else { delete mapping[key]; me.get(key,function(newData){ callback(newData); }); } } else { buf[mapping[key]].visited=true; buf[mapping[key]].time = Date.now(); callback(buf[mapping[key]].data); } } else { // datastore loading + cache eviction let ctrFound = -1; while(ctrFound===-1) { if(!buf[ctr].locked && buf[ctr].visited) { buf[ctr].visited=false; } ctr++; if(ctr >= size) { ctr=0; } if(!buf[ctrEvict].locked && !buf[ctrEvict].visited) { // evict buf[ctrEvict].locked = true; ctrFound = ctrEvict; } ctrEvict++; if(ctrEvict >= size) { ctrEvict=0; } } mappingInFlightMiss[key]=true; let f = function(res){ delete mapping[buf[ctrFound].key]; buf[ctrFound] = {data: res, visited:false, key:key, time:Date.now(), locked:false}; mapping[key] = ctrFound; callback(buf[ctrFound].data); delete mappingInFlightMiss[key]; }; loadData(key,f); } };};exports.Lru = Lru;文件缓存示例:let Lru = require("./lrucache.js").Lru;let fs = require("fs");let path = require("path");let fileCache = new Lru(500, async function(key,callback){ // cache-miss data-load algorithm fs.readFile(path.join(__dirname,key),function(err,data){ if(err) { callback({stat:404, data:JSON.stringify(err)}); } else { callback({stat:200, data:data}); } });},1000 /* cache element lifetime */);应用LRU构造函数获取参数(高速缓存大小、高速缓存未命中的关键字和回调、高速缓存因素生命周期)来结构CLOCK高速缓存。 ...

April 30, 2021 · 4 min · jiezi

关于node.js:前端面试每日-31-第745天

明天的知识点 (2021.04.30) —— 第745天 (我也要出题)[html] 如何显示上传文件的进度?[css] 写一个小球上下跳动的动画[js] 请解释下什么是js的装箱和拆箱?[软技能] 作为管理者,你是如何帮忙团队成长呢?《论语》,曾子曰:“吾日三省吾身”(我每天屡次检查本人)。前端面试每日3+1题,以面试题来驱动学习,每天提高一点!让致力成为一种习惯,让奋斗成为一种享受!置信 保持 的力量!!! 欢送在 Issues 和敌人们一起探讨学习! 我的项目地址:前端面试每日3+1【举荐】欢送跟 jsliang 一起折腾前端,零碎整顿前端常识,目前正在折腾 LeetCode,打算买通算法与数据结构的任督二脉。GitHub 地址 微信公众号欢送大家前来探讨,如果感觉对你的学习有肯定的帮忙,欢送点个Star, 同时欢送微信扫码关注 前端剑解 公众号,并退出 “前端学习每日3+1” 微信群互相交换(点击公众号的菜单:交换)。 学习不打烊,充电加油只为遇到更好的本人,365天无节假日,每天早上5点纯手工公布面试题(死磕本人,愉悦大家)。心愿大家在这虚夸的前端圈里,放弃沉着,保持每天花20分钟来学习与思考。在这变幻无穷,类库层出不穷的前端,倡议大家不要等到找工作时,才狂刷题,提倡每日学习!(不忘初心,html、css、javascript才是基石!)欢送大家到Issues交换,激励PR,感激Star,大家有啥好的倡议能够加我微信一起交换探讨! 心愿大家每日去学习与思考,这才达到来这里的目标!!!(不要为了谁而来,要为本人而来!)交换探讨欢送大家前来探讨,如果感觉对你的学习有肯定的帮忙,欢送点个[Star]

April 30, 2021 · 1 min · jiezi

关于node.js:Koa-洋葱模型

微信公众号:[前端一锅煮]一点技术、一点思考。前言:Koa 是一个新的 web 框架,由 Express 幕后的原班人马打造, 致力于成为 web 利用和 API 开发畛域中的一个更小、更富裕表现力、更强壮的基石。 通过利用 async 函数,Koa 帮你抛弃回调函数,并无力地加强错误处理。 Koa 并没有捆绑任何中间件, 而是提供了一套优雅的办法,帮忙您疾速而欢快地编写服务端应用程序。 什么是洋葱模型?咱们先来看一个 demo: const Koa = require('koa')const app = new Koa() // 应用程序// 中间件1app.use((ctx, next) => { console.log(1) next() console.log(2)})// 中间件2app.use((ctx, next) => { console.log(3) next() console.log(4)})app.listen(9000, '0.0.0.0', () => { console.log(`Server is starting`)})浏览器输出 localhost:9000,控制台会有如下打印: 1342很显著,在 koa 的中间件中,通过 next 函数,将中间件分成了两局部,next 下面的一部分会首先执行,而上面的一部分则会在所有后续的中间件调用之后执行。 Koa 中间件执行程序: 外层中间件进行后期解决(next 前的逻辑);调用 next,将控制流交给下个中间件,并 await 其实现,直到前面没有中间件或者没有 next 函数执行为止;实现后,一层层回溯执行各个中间件的前期解决(next 后的逻辑)。自定义实现从实质上来说,洋葱模型实际上就是一个实现以下成果的函数调用办法。 async function f(){ console.log(1); await f2() console.log(2);}async function f2() { console.log(3); await f3() console.log(4);}async function f3() { console.log(5); console.log(6);}f()输入: ...

April 29, 2021 · 2 min · jiezi

关于node.js:前端面试每日-31-第743天

明天的知识点 (2021.04.28) —— 第743天 (我也要出题)[html] 如何阻止页面的字体主动调整大小?[css] 应用css画一个椭圆[js] 如何深度解冻对象?度解冻对象有什么作用?[软技能] 你开发的web站点有解决网络断开的机制吗?《论语》,曾子曰:“吾日三省吾身”(我每天屡次检查本人)。前端面试每日3+1题,以面试题来驱动学习,每天提高一点!让致力成为一种习惯,让奋斗成为一种享受!置信 保持 的力量!!! 欢送在 Issues 和敌人们一起探讨学习! 我的项目地址:前端面试每日3+1【举荐】欢送跟 jsliang 一起折腾前端,零碎整顿前端常识,目前正在折腾 LeetCode,打算买通算法与数据结构的任督二脉。GitHub 地址 微信公众号欢送大家前来探讨,如果感觉对你的学习有肯定的帮忙,欢送点个Star, 同时欢送微信扫码关注 前端剑解 公众号,并退出 “前端学习每日3+1” 微信群互相交换(点击公众号的菜单:交换)。 学习不打烊,充电加油只为遇到更好的本人,365天无节假日,每天早上5点纯手工公布面试题(死磕本人,愉悦大家)。心愿大家在这虚夸的前端圈里,放弃沉着,保持每天花20分钟来学习与思考。在这变幻无穷,类库层出不穷的前端,倡议大家不要等到找工作时,才狂刷题,提倡每日学习!(不忘初心,html、css、javascript才是基石!)欢送大家到Issues交换,激励PR,感激Star,大家有啥好的倡议能够加我微信一起交换探讨! 心愿大家每日去学习与思考,这才达到来这里的目标!!!(不要为了谁而来,要为本人而来!)交换探讨欢送大家前来探讨,如果感觉对你的学习有肯定的帮忙,欢送点个[Star]

April 28, 2021 · 1 min · jiezi

关于node.js:你知道node为什么会有buffer吗

在node中,buffer意思为“缓冲区”,buffer精确说是放在缓冲区里的二进制数据。 这里有一个缓冲区的概念。 缓冲区是内存空间的一部分,在内存空间中预留了肯定的存储空间来寄存IO输出和输入的数据。计算机之所以要弄一个缓冲区,是为了在IO过程均衡不同IO介质的速度差。 诸如往要写入一段数据到磁盘中,计算机会先将数据写入到内存缓冲区中暂存,要么数据曾经写完,要么缓冲区已写满,此时cpu就会把缓冲区的中的数据,一次性写入到磁盘中。 为什么要这样做?如果要写入的一段数据,一共有10个数据块。同时假如,cpu把数据写入到内存缓冲区是1秒,而把数据写入到磁盘中是10秒。 那么,依照缓冲区的机制,十块数据写到内存缓冲区中一共要10秒,而后cpu把内存缓冲区的中数据写入磁盘破费10秒,那么这一段数据最终写入到存储介质中,一共花了20秒。而如果没有内存缓冲区,每一块数据都由CPU间接写入到磁盘的话,每一次写入时是10秒,那么十块数据共十次写入磁盘,那么这段数据写入存储介质中一共破费了100秒。这样的区别是不言而喻的,破费100秒就齐全拖慢了cpu让它不能去干别的事件了。 从实质上讲,这是因为这一段数据(比方说是一个文件),它不可能被cpu一次就把整个文件的数据读出来,如果这样能够的话,那么一次读取进去了整个文件数据,而后间接只一次写入到磁盘,那这样只有10秒,这当然好,但这样平步青云的事件是不可能的,cpu是不可能一次取出整个文件数据的,它必定是要一点一点去读,也要一点一点去写,它总得有一个过程。 缓冲区是与IO间接关联的,正是因为有网络IO,磁盘IO,才有缓冲区的存在。 在过来的js中,js是为浏览器而生的,在浏览器中,js自身是没有IO操作的,js发什么ajax申请、抉择文件上传,看起来js有IO操作,实际上这都是由浏览器本身底层代码在操作系统上实现,js自身是没有IO的,因为没有IO所以过来的js也没有二进制数据的示意和解决计划。而到了node这里,node就相当于是浏览器底层了,间接和操作系统打交道,而浏览器的js,只是在和浏览器打交道,浏览器再和操作系统打交道。 node中不论是读数据还是写数据,不论这个数据是来自还是去向网络还是磁盘,这些IO操作的数据都在内存缓冲区中直达。node因为要解决这些网络、磁盘等IO操作,这些IO操作都是二进制数据,因而node减少了Buffer类型。 node读取进去的文件默认就是buffer数据,也就是读取进去的就是放在内存缓冲区的二进制数据。

April 27, 2021 · 1 min · jiezi

关于node.js:前端面试每日-31-第741天

明天的知识点 (2021.04.26) —— 第741天 (我也要出题)[html] 你感觉html5能够做什么有意思的事件?[css] padding-top、padding-bottom值设置为百分比时,根据的是父级的height吗?[js] 一元运算符有哪些?[软技能] 来这面试之前,你有没有看过哪些面试题?《论语》,曾子曰:“吾日三省吾身”(我每天屡次检查本人)。前端面试每日3+1题,以面试题来驱动学习,每天提高一点!让致力成为一种习惯,让奋斗成为一种享受!置信 保持 的力量!!! 欢送在 Issues 和敌人们一起探讨学习! 我的项目地址:前端面试每日3+1【举荐】欢送跟 jsliang 一起折腾前端,零碎整顿前端常识,目前正在折腾 LeetCode,打算买通算法与数据结构的任督二脉。GitHub 地址 微信公众号欢送大家前来探讨,如果感觉对你的学习有肯定的帮忙,欢送点个Star, 同时欢送微信扫码关注 前端剑解 公众号,并退出 “前端学习每日3+1” 微信群互相交换(点击公众号的菜单:交换)。 学习不打烊,充电加油只为遇到更好的本人,365天无节假日,每天早上5点纯手工公布面试题(死磕本人,愉悦大家)。心愿大家在这虚夸的前端圈里,放弃沉着,保持每天花20分钟来学习与思考。在这变幻无穷,类库层出不穷的前端,倡议大家不要等到找工作时,才狂刷题,提倡每日学习!(不忘初心,html、css、javascript才是基石!)欢送大家到Issues交换,激励PR,感激Star,大家有啥好的倡议能够加我微信一起交换探讨! 心愿大家每日去学习与思考,这才达到来这里的目标!!!(不要为了谁而来,要为本人而来!)交换探讨欢送大家前来探讨,如果感觉对你的学习有肯定的帮忙,欢送点个[Star]

April 26, 2021 · 1 min · jiezi

关于node.js:理解Node中的Buffer与stream

最近加入公司组织的Node学习小组,每个人认领不同的知识点,并和组内同学分享。很喜爱这样的学习模式,除了能够零碎学习外,还能倒逼本人输入,播种颇多,把本人筹备的笔记分享进去。 简介Buffer 简介编码内存分配机制API概览stream 简介可读流可写流双工流实现与应用简介Buffer是数据以二进制模式长期寄存在内存中的物理映射,stream为搬运数据的传送带和加工器,有方向、状态、缓冲大小。 比方咱们实现一个将图片和音频读取到内存而后加工为的视频程序,相似于将原料运输到工厂而后加工为月饼的流程。 Buffer简介缓冲区 数据的挪动是为了解决或读取它,如果数据达到的速度比过程耗费的速度快,那么多数早达到的数据会处于期待区等待被解决。《Node.js 中的缓冲区(Buffer)到底是什么?》 咱们读一个秘钥文件进入内存,必定是等整个文件读入内存后再解决,要提前划分寄存的空间。就像摆渡车一样,坐满了20位才发车,乘客有早到有晚到,必须有一个中央等待,这就是缓冲区。 Buffer是数据以二进制模式长期寄存在内存中的物理映射。 晚期js没有读取操作二进制的机制,js最后设计是为了操作html。 Node晚期为了解决图像、视频等文件,将字节编码为字符串来解决二进制数据,速度慢。ECMAScript 2015公布 TypedArray,更高效的拜访和解决二进制,用于操作网络协议、数据库、图片和文件 I/O 等一些须要大量二进制数据的场景。 Buffer 对象用于示意固定长度的字节序列。Buffer 类是 JavaScript 的 Uint8Array 类的子类,且继承时带上了涵盖额定用例的办法。 只有反对 Buffer 的中央,Node.js API 都能够承受一般的 Uint8Array。-- 官网文档因为历史起因,晚期的JavaScript语言没有用于读取或操作二进制数据流的机制。因为JavaScript最后被设计用于解决HTML文档,而文档次要由字符串组成。-- 《Node.js 企业级利用开发实际》总结起来一句话 Node.js 能够用来解决二进制流数据或者与之进行交互。-- 《Node.js 中的缓冲区(Buffer)到底是什么?》编解码将原始字符串与指标字符串进行互转。 编码:将音讯转换为适宜传输的字节流。解码:将传输的字节流转换为> 程序可用的音讯格局 --《Node.js企业级利用开发实战》>Buffer与String传输比照const http = require('http');let s = '';for (let i=0; i<1024*10; i++) { s+='a'}const str = s;const bufStr = Buffer.from(s);const server = http.createServer((req, res) => { console.log(req.url); if (req.url === '/buffer') { res.end(bufStr); } else if (req.url === '/string') { res.end(str); }});server.listen(3000);# -c 200并发数 -t 期待响应最大工夫 秒$ ab -c 200 -t 60 http://localhost:3000/buffer$ ab -c 200 -t 60 http://localhost:3000/string雷同的测试参数,Buffer实现申请13998次,string实现申请9237次,相差4761次,Buffer比字符串的的传输更快。 ...

April 26, 2021 · 4 min · jiezi

关于node.js:CMPT-135-202101-Final-Project

CMPT 135 202101 Final ProjectDue Date and Time: Tuesday 20 April 2021 at 7:00AM PSTVision of ProjectIn this project we are going to build a software solution for the computation of the shortest path from oneplace to another place in a two dimensional space similar to a global positioning system (GPS) without makinguse of any C++ library; instead building everything from scratch.The vision of the project is that given the map of a region and its road connectivity, we would like to computethe shortest path to go from one place to another place. See the diagram below for illustration purposes.Fig 1: Region map and its road connectivityAs we can see in the illustration above, places in the region are connected by roads. There may or may not bea direct road from a place to another. In the illustration above for example, there is a direct road fromVancouver to North Vancouver but there is no a direct road from Vancouver to Port Coquitlam. However, wecan go from Vancouver to Port Coquitlam in several ways among which are the following paths (or routes)Vancouver  Burnaby  Port CoquitlamVancouver  Coquitlam  Port CoquitlamVancouver BurnabyNew Westminster  Port CoquitlamCMPT 135 – FIC 202101 – Final Exam Project – Dr. Yonas T. Weldeselassie (Ph.D.) Page 2Moreover, we assume that the roads are two ways and that whenever there is a road from A to B then weautomatically assume that there is a road from B to A. That is, we assume that roads are symmetric by nature.Thus we may go from Vancouver to Port Coquitlam using the following routes as wellVancouver DeltaSurrey Port CoquitlamVancouver  Coquitlam  Burnaby  Port CoquitlamOr if we want to waste our time going in an unnecessary loop, then we may go in the following route tooVancouver Burnaby RichmondNew WestminsterBurnaby  Port CoquitlamWe can still find many more possible routes.The aim of our project is therefore to find the shortest path. Of course in order to compute the shortest path,we need to be given the distances between pairs of cities along the roads as shown on the illustration above.In computing science, we generally speak in terms of the cost of a path. The cost can be any measurablequantity as you go from one place to another place. Typical costs include distances between places (like theillustration shown above), the amount of petrol you will burn as you drive from one place to another, or someother measurements. Thus the shortest path problem is generally referred to as the minimum cost path.For example if the cost under consideration is the amount of petrol you burn as you go from one place toanother, then it should also be noted that you may burn more petrol on a given shorter distance road than alonger one. For example if the longer road is a freeway (highway) but the shorter one is a congested road in acity. This is how a typical GPS device (application) works.Therefore, we need to always define what measurement to use to compute costs of paths so that we canselect the minimum cost path based on the measure under consideration.In the illustration above for example, assuming the cost is the distances shown in the illustration; then thecosts of the six paths we have listed above will respectively be: 11.2, 9.8, 14.3, 16.7, 15.9, and 25.0. Since theminimum cost among the costs computed is 9.8, we therefore conclude that the minimum cost path amongthe paths shown above is therefore to go through the pathVancouver  Coquitlam  Port Coquitlam [cost = 9.8]Of course it should also be noted from the paths listed above that the last one, that isVancouver Burnaby RichmondNew WestminsterBurnaby  Port Coquitlamis a useless computation because the path contains a loop (that is to say the path passes through a place butthen loops back to the same place before it reaches the destination place). A path with a loop shouldobviously be avoided.Terminologies Graph: The region map with its road connectivity shown in the diagram above is called a graph. Vertex: A vertex (plural vertices) is a unit in a graph (such as a city in the diagram above). Edge: A unit in a graph that connects pairs of vertices of the graph. Path: A route to go from one vertex of a graph to another following the edges in the graph. Origin Vertex of an edge: A vertex from where an edge emanates (comes out from). Destination Vertex of an edge: A vertex where an edge ends (comes into).CMPT 135 – FIC 202101 – Final Exam Project – Dr. Yonas T. Weldeselassie (Ph.D.) Page 3Scope of ProjectThe scope of the project will encompass Data Structures: The design of classes to represent vertices, edges, graph, and paths in a graph. Algorithms: The design of clearly defined steps to solve the shortest path problem.Restrictions of LibrariesWe would like to build the project from scratch. Thus we will limit ourselves to using only a few libraries of C++language; namely ...

April 25, 2021 · 33 min · jiezi

关于node.js:万字长文详解如何搭建一个属于自己的博客纯手工搭建

前言因为本人以前就搭建了本人的博客零碎,那时候博客零碎前端基本上都是基于vue的,而当初用的react偏多,于是用react对整个博客零碎进行了一次重构,还有对以前存在的很多问题进行了更改与优化。零碎都进行了服务端渲染SSR的解决。 博客地址传送门 本我的项目残缺的代码:GitHub 仓库 本文篇幅较长,会从以下几个方面进行开展介绍: 核心技术栈目录构造详解我的项目环境启动Server端源码解析Client端源码解析Admin端源码解析HTTPS创立核心技术栈React 17.x (React 全家桶)Typescript 4.xKoa 2.xWebpack 5.xBabel 7.xMongodb (数据库)eslint + stylelint + prettier (进行代码格局管制)husky + lint-staged + commitizen +commitlint (进行 git 提交的代码格局校验跟 commit 流程校验)外围大略就是以上的一些技术栈,而后基于博客的各种需要进行性能开发。像例如受权用到的jsonwebtoken,@loadable,log4js模块等等一些性能,我会上面各个功能模块开展篇幅进行解说。 package.json 配置文件地址目录构造详解|-- blog-source |-- .babelrc.js // babel配置文件 |-- .commitlintrc.js // git commit格局校验文件,commit格局不通过,禁止commit |-- .cz-config.js // cz-customizable的配置文件。我采纳的cz-customizable来做的commit标准,本人自定义的一套 |-- .eslintignore // eslint疏忽配置 |-- .eslintrc.js // eslint配置文件 |-- .gitignore // git疏忽配置 |-- .npmrc // npm配置文件 |-- .postcssrc.js // 增加css款式前缀之类的货色 |-- .prettierrc.js // 格局代码用的,对立格调 |-- .sentryclirc // 我的项目监控Sentry |-- .stylelintignore // style疏忽配置 |-- .stylelintrc.js // stylelint配置文件 |-- package.json |-- tsconfig.base.json // ts配置文件 |-- tsconfig.json // ts配置文件 |-- tsconfig.server.json // ts配置文件 |-- build // Webpack构建目录, 别离给client端,admin端,server端进行区别构建 | |-- paths.ts | |-- utils.ts | |-- config | | |-- dev.ts | | |-- index.ts | | |-- prod.ts | |-- webpack | |-- admin.base.ts | |-- admin.dev.ts | |-- admin.prod.ts | |-- base.ts | |-- client.base.ts | |-- client.dev.ts | |-- client.prod.ts | |-- index.ts | |-- loaders.ts | |-- plugins.ts | |-- server.base.ts | |-- server.dev.ts | |-- server.prod.ts |-- dist // 打包output目录 |-- logs // 日志打印目录 |-- private // 动态资源入口目录,设置了多个 | |-- third-party-login.html |-- publice // 动态资源入口目录,设置了多个 |-- scripts // 我的项目执行脚本,包含启动,打包等等 | |-- build.ts | |-- config.ts | |-- dev.ts | |-- start.ts | |-- utils.ts | |-- plugins | |-- open-browser.ts | |-- webpack-dev.ts | |-- webpack-hot.ts |-- src // 外围源码 | |-- client // 客户端代码 | | |-- main.tsx // 入口文件 | | |-- tsconfig.json // ts配置 | | |-- api // api接口 | | |-- app // 入口组件 | | |-- appComponents // 业务组件 | | |-- assets // 动态资源 | | |-- components // 公共组件 | | |-- config // 客户端配置文件 | | |-- contexts // context, 就是用useContext创立的,用来组件共享状态的 | | |-- global // 全局进入client须要进行调用的办法。像相似window上的办法 | | |-- hooks // react hooks | | |-- pages // 页面 | | |-- router // 路由 | | |-- store // Store目录 | | |-- styles // 款式文件 | | |-- theme // 款式主题文件,做换肤成果的 | | |-- types // ts类型文件 | | |-- utils // 工具类办法 | |-- admin // 后盾治理端代码,同客户端差不太多 | | |-- .babelrc.js | | |-- app.tsx | | |-- main.tsx | | |-- tsconfig.json | | |-- api | | |-- appComponents | | |-- assets | | |-- components | | |-- config | | |-- hooks | | |-- pages | | |-- router | | |-- store | | |-- styles | | |-- types | | |-- utils | |-- models // 接口模型 | |-- server // 服务端代码 | | |-- main.ts // 入口文件 | | |-- config // 配置文件 | | |-- controllers // 控制器 | | |-- database // 数据库 | | |-- decorators // 装璜器,封装了@Get,@Post,@Put,@Delete,@Cookie之类的 | | |-- middleware // 中间件 | | |-- models // mongodb模型 | | |-- router // 路由、接口 | | |-- ssl // https证书,目前我是本地开发用的,线上如果用nginx的话,在nginx处配置就行 | | |-- ssr // 页面SSR解决 | | |-- timer // 定时器 | | |-- utils // 工具类办法 | |-- shared // 多端共享的代码 | | |-- loadInitData.ts | | |-- type.ts | | |-- config | | |-- utils | |-- types // ts类型文件 |-- static // 动态资源 |-- template // html模板以上就是我的项目大略的文件目录,下面曾经形容了文件的根本作用,上面我会具体博客性能的实现过程。目前博客零碎各端没有拆分进去,接下里会有这个打算。 ...

April 24, 2021 · 23 min · jiezi

关于node.js:node的垃圾回收

node的内存限度:内存限度和起因:对于node来说,内存始终是限度node在后端宽泛深度应用的起因,因为node的v8引擎能从服务器的内核中调配进去的内存不多: 对于32位的零碎,v8调配进去的内存个别只有0.7g; 对于64位零碎,v8调配进去的内存个别只有1.4g; 因而如果将一个比拟大的内容存储在内容或者一个存储在内存的体积超过了对应零碎v8的下限,就会呈现out of memory,从而退出node过程(单过程)。 外表起因:是因为v8岂但要应用在服务端环境,还须要在浏览器环境下应用,所以为了衡量两者对内村的须要,只能失去上述的v8内存限度; 外在起因:在v8引擎中,GC进行一次,此时js线程就会暂停,期待GC回收实现再持续未实现的工作,而调配给v8的内存越大,GC的耗时可能就会越大,这样会升高响应的效率,例如给调配1.5g内存,GC回收一个大的对象时可能会须要1s钟,因而才会对v8的内存做出了限度。 查看内存使用率:能够通过node提供的API来查看node的内存: const {rss, heapTotal, heapUsed, external} = process.memoryUsage(){ rss:node常驻内存的大小,包含v8内存,堆外内存和c++等内存的总和; heapTotal:v8申请的总内存; heapUsage:v8应用的总内存; external:c++外面和js产生关联的对象内存;}查看GC回收耗时3.1 : node --trace_gc index.js:通过--trace_gc来查看gc日志信息; (输入的信息可读性不强) 3.2 node --prof index.js该命令能够执行完js文件之后,生成一系列的统计数据,输入一个xxxx-v8.log的日志文件;有两种路径剖析这个文件: 1)下载tick的npm包: sudo npm install tick -g 该npm包能够剖析v8.log文件,而后输入一些列的统计数据; node-tick-processor xxx-v8.log 图中通过207个tick(零碎时钟)总占比15.1%; 2)node的v5版本后能够通过 --prof-processor解决该文件 node --prof-process xxxx-v8.log 该指令能够具体的输入内存占比和耗时。 垃圾回收形式:个别援用计数:原理解释:就是一个值被赋予给其余变量,那么该值的援用次数+1;如果含有该值的变量更新了其值,那么该值的援用次数就减一,直到整个执行周期完结后,该值的援用次数为0,那么此时就会被垃圾回收; let a = {a1: 1};let b = a // 此时a的计次为1b = 0 // 此时a的计次为0;存在问题:就是存在互相援用的景象呈现,从而引发内存泄露; // a.jsimport b from 'b.js'export let a = {c: b}// b.jsimport a from 'a.js'export let b = {c: a}node的GC形式:node的v8引擎将呈现在内存中的变量分为新生代和老生代,新生代是示意存活工夫不长的变量,老生代就是存活工夫较长或者常驻内存的变量,所以v8申请的内存会划分为两局部分给这两种生代的变量应用,对应的回收这两种生代的GC也不一样; ...

April 23, 2021 · 2 min · jiezi

关于node.js:CabloyJS实现了一款基于X6的工作流可视化编辑器

介绍文档演示:CMS审批工作流演示了如何通过JSON来间接创立一个工作流定义,通常用于为具体的业务数据生成预约义或内置审批工作流的场景 CabloyJS 4.8.0采纳X6 图编辑引擎实现了一款工作流可视化编辑器,从而能够在零碎运行过程中,随时、动静、可视化的创立工作流定义 特地要感激X6提供了十分弱小的图编辑引擎,而且也提供了非常灵活的开发接口和扩大接口。基于X6的无力撑持,工作流可视化编辑器的简单局部反而不再是图编辑自身了,而是各个节点的属性编辑表单,以及表单背地的API接口的配套反对 如果大家对X6 图编辑引擎有趣味,肯定要看看CabloyJS 4.8.0,这会是一个十分清晰的入门案例 演示Mobile PC 相干链接官网: https://cabloy.com/GitHub: https://github.com/zhennann/cabloy

April 23, 2021 · 1 min · jiezi

关于node.js:️-什么项目构建时内存溢出了了解一下-node-内存限制

背景在之前的一篇文章中, 咱们遇到了一个我的项目在构建时内存溢出的问题。 过后的解决方案是: 间接调大 node 的内存限度,防止达到内存下限。 明天听共事分享了一个新办法,感觉不错, 特此记录, 顺便分享给大家, 心愿对大家有所帮忙。 注释间接上报错示意图: 提醒曾经很显著: Javascript Heap out of memory. 看到内存溢出这个关键字,咱们个别都会思考到是因为 Node.js 内存不够导致的。 但 Node 过程的内存限度会是多少呢? 在网上查阅了到如下形容: Currently, by default V8 has a memory limit of 512mb on 32-bit systems, and 1gb on 64-bit systems. The limit can be raised by setting --max-old-space-size to a maximum of ~1gb (32-bit) and ~1.7gb (64-bit), but it is recommended that you split your single process into several workers if you are hitting memory limits.翻译一下: ...

April 22, 2021 · 3 min · jiezi

关于node.js:NPM工程化-inquirer源码解析

从npm run-script利用开始查看某些NPM包的npm_package_scripts,常常能够看到一下run-script示例: ... "scripts": { "prerelease": "npm test && npm run integration", "release": "env-cmd lerna version", "postversion": "lerna publish from-git", "fix": "npm run lint -- --fix", "lint": "eslint . -c .eslintrc.yaml --no-eslintrc --ignore-path .gitignore --cache --cache-location ./node_modules/.cache/eslint", "integration": "jest --config jest.integration.js --maxWorkers=2", "pretest": "npm run lint", "test": "jest" },...对其中一一解说: 自定义npm run-script在NPM敌对型环境(npm init -y)下,能够将node index.js定义在npm_package_scripts_*中作为别名间接执行。 { "name": "cli", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "d1": "node ./demo1/bin/operation.js" }, "keywords": [], "author": "", "license": "ISC"}在命令行中输出npm run d1就是执行node ./demo1/bin/operation.js ...

April 19, 2021 · 4 min · jiezi

关于node.js:从零到壹Koa-从理解到实现

【点击查看文中的相干源码】 依据官网的介绍,Koa 是一个新的 Web 框架,致力于成为 Web 利用和 API 开发畛域中的一个更小、更富裕表现力和更强壮的基石。 通过 async 函数,Koa 不仅远离回调天堂,同时还无力地加强了错误处理。而且,一个要害的设计点是在其低级中间件层中提供了高级“语法糖”,这包含诸如内容协商,缓存清理,代理反对和重定向等常见工作的办法。 根底实际上,咱们常见的一些 Web 框架都是通过应用 Http 模块来创立了一个服务,在申请到来时通过一系列的解决后把后果返回给前台,事实上 Koa 外部大抵也是如此。 通过查看源码不难发现 Koa 次要分为四个局部:应用程序、上下文、申请对象和响应对象,当咱们引入 Koa 时实际上就是拿到了负责创立应用程序的这个类。 咱们先来看一下一个简略的 Hello World 利用: const Koa = require('koa')const app = new Koa()app.use(async ctx => { ctx.body = 'Hello World'})app.listen(3000, () => console.log('The app is running on localhost:3000'))运行下面的代码并拜访 http://localhost:3000/,一个简略的利用就这样创立好了。 实现依据下面的应用形式咱们能够很容易的想到上面的实现: const http = require('http')module.exports = class Application { use(fn) { this.middleware = fn } callback() { const handleRequest = (req, res) => { this.middleware(req, res) } return handleRequest } listen(...args) { const server = http.createServer(this.callback()) return server.listen(...args) }}在下面的例子中,中间件失去的参数还是原生的申请和响应对象。依照 Koa 的实现,当初咱们须要创立一个贯通整个申请的上下文对象,上下文中包含了原生的和封装的申请、响应对象。 ...

April 12, 2021 · 4 min · jiezi

关于centos7:CentOS7系统中node安装配置

导语:本篇解说如何配置node开发环境,让你的node代码能够失常的在网页中运行。筹备工作linux centos7操作系统ssh软件nginxnode资源想要理解更多对于node的内容,请拜访: nodejs官网 装置node本次装置介绍两个版本的装置办法,一个是源码装置,另一个是已编译版本装置, 源码装置已编译版本装置源码装置第一步,到官网查看最新源码,并下载cd /home/downloadswget https://nodejs.org/dist/v10.16.0/node-v10.16.0.tar.gz第二步,解压源码tar xzvf node-v10.16.0.tar.gzcd node-v10.16.0第三步,装置编译软件sudo yum install gcc gcc-c++第四步,编译装置./configuremakesudo make install大略须要半个小时工夫,编译实现查看版本号。 node --version如果有显示版本号,阐明装置胜利。 已编译版本装置下载已编译版本cd /home/downloadswget https://nodejs.org/dist/v10.16.0/node-v10.16.0-linux-x64.tar.xz解压tar -xvf node-v10.16.0-linux-x64.tar.xzmv node-v10.16.0-linux-x64 /home/soft/node10建设软连贯这样就能够全局应用了。 ln -s /home/soft/node10/bin/npm /usr/local/bin/ln -s /home/soft/node10/bin/node /usr/local/bin/查看版本node -vnpm -v自动化node装置pm2管理软件npm install pm2 -g全局配置ln -s /home/soft/node10/bin/pm2 /usr/local/bin/pm2pm2常用命令启动:pm2 start app_name|app_id进行:pm2 stop app_name|app_id 删除:pm2 delete app_name|app_id 重启:pm2 restart app_name|app_id 进行所有:pm2 stop all 查看所有的过程:pm2 list 查看所有的过程状态:pm2 status 查看某一个过程的信息:pm2 describe app_name|app_id nginx配置node环境新建nginx配置文件,输出以下内容。vi /etc/nginx/vhost/node.conf在外面输出: server { listen 80; # 监听端口 server_name node.example.org; # 拜访域名 access_log /var/www/node/access.log; # 胜利日志 error_log /var/www/node/error.log; # 谬误日志 location / { proxy_pass http://127.0.0.1:3000; } # 动态文件图片规定 location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { expires 30d; } # 动态文件js、css规定 location ~ .*\.(js|css)?$ { expires 1h; }}关上3000端口。firewall-cmd --add-port=3000/tcp --permanentfirewall-cmd --reload配置完了当前重载重启nginx。 ...

April 10, 2021 · 1 min · jiezi

关于node.js:nodeJs

express框架https://www.jianshu.com/p/730...node应用express+multer文件上传和下载的问题https://www.jianshu.com/p/427...

April 8, 2021 · 1 min · jiezi

关于node.js:前端那些事八webpack

参考视频 文章: http://www.woc12138.com/article/45 https://segmentfault.com/a/1190000006178770 https://mp.weixin.qq.com/s?__... https://www.jianshu.com/nb/45770544 webpack简介webpack 是一种前端资源构建工具,一个动态模块打包器(module bundler)。 在webpack 看来, 前端的所有资源文件(js/json/css/img/less/...)都会作为模块解决。 它将依据模块的依赖关系进行动态剖析,打包生成对应的动态资源(bundle)。 5个外围Entry入口:批示 webpack 以哪个文件为入口终点开始打包,剖析构建外部依赖图,trunk。 Output输入:批示 webpack 打包后的资源 bundles 输入到哪里去,以及如何命名。 翻译:让 webpack 可能去解决那些非 JS 的文件,比方款式文件、图片文件(webpack 本身只了解JS) Plugins插件:对象, 能够用于执行范畴更广的工作。插件的范畴包含从打包优化和压缩,始终到从新定义环境中的变量等,相当于钩子函数。 Mode模式:批示 webpack 应用相应模式的配置,development开发模式和production生产模式。 loader:函数,在构建过程中,文件转换器,文件转换的工作;a.less=>a.css webpack的装置webpack 打包原理先递归辨认依赖,构建依赖图谱 把代码转换成 AST 形象语法树 在 AST 中去解决代码 将 AST 形象语法树变成浏览器能够辨认的代码并输入 https://github.com/bestCindy/mini-webpack/blob/main/README.md webpack打包过程辨认入口文件 通过逐层辨认模块依赖。(Commonjs、amd或者es6的import,webpack都会对其进行剖析。来获取代码的依赖) webpack做的就是剖析代码。转换代码,编译代码,输入代码 最终造成打包后的代码 https://segmentfault.com/a/1190000020266246 (一)将代码转换成 AST 形象语法树 利用 babel-parser 转换 代码在 convertToAST.js 文件中 (二)找到依赖关系 利用 traverse 遍历 AST 形象语法树 找到文件的依赖关系 代码在 convertToDependency.js 外面 ...

April 8, 2021 · 2 min · jiezi

关于云开发:简单几步用云函数上传文件至静态网站托管

前言云开发CloudBase为开发者提供动态网站托管的能力,动态资源(HTML、CSS、JavaScript、字体等)的散发由对象存储 COS 和领有多个边缘网点的 CDN 提供反对。 本篇文章将应用云开发 Node.js 治理端 SDK演示,只需简略几步即可在云函数中上传文件到动态网站托管。 筹备创立云开发按量计费环境;在按量计费环境下开明动态网站托管;查问腾讯云拜访密钥。操作步骤一、获取拜访密钥:secretId 和 secretKey关上腾讯云控制台,在右上角头像地位下拉菜单中找到拜访治理并点击进入。 抉择左侧菜单栏中的拜访密钥-API密钥治理,点击新建密钥。 点击“显示”,依据提醒操作即可取得密钥。 二、创立云函数关上云开发 CloudBase 控制台,抉择按量付费环境,抉择左侧菜单栏的云函数。 点击新建云函数,而后依据提示信息填写云函数配置信息,实现创立即可。 点击刚刚创立的云函数,进入编辑页面,点击“函数代码”。 复制测试代码到新创建的云函数中,并批改envId(云开发环境id)、secretId和secretKey(获取形式见上一步)。 const CloudBase = require('@cloudbase/manager-node')const fs = require('fs')const { hosting } = new CloudBase({secretId: 'Your SecretId', // 腾讯云API密钥SecretId https://console.cloud.tencent.com/cam/capisecretKey: 'Your SecretKey', // 腾讯云API密钥SecretKey https://console.cloud.tencent.com/cam/capienvId: 'Your envId' // 云开发环境ID,可在腾讯云云开发控制台获取 https://console.cloud.tencent.com/tcb/env/index})exports.main = async(event, context) => {//写入文件到云函数长期目录const content = '测试内容!'fs.writeFile('/tmp/test.txt', content, (err) => {if (err) {return console.log(err);}console.log("File saved successfully!");})let fileCount = 0// 上传文件await hosting.uploadFiles({files: [{localPath: '/tmp/test.txt',cloudPath: 'hosting/test_data/data.txt'}],ignore: ['**/ignore.*'],onFileFinish: () => {fileCount++}})console.log(fileCount) // 1return fileCount}以及 package.json 文件: ...

April 7, 2021 · 1 min · jiezi

关于visual-studio-code:一个好用的Visual-Studio-Code扩展-Live-Server适用于前端小工具开发

一个好用的Visual Studio Code扩大 - Live Server,实用于前端小工具开发Jerry 平时在写一些简略的 SAP UI5 利用时,喜爱从这篇文章里介绍的脚手架利用作为模板,开始编程: 一个用于SAP UI5学习的脚手架利用,没有任何后盾API的依赖 下面这篇文章的SAP UI5脚手架利用,应用到了nodejs express库作为本地服务器,来预览 SAP UI5 利用运行时的成果。 明天我找到了另一个 Visual Studio Code 扩大:Live Server,作者是 Ritwick Dey, 应用起来同样十分不便: 装置好Visual Studio Code Live Server之后,Visual Studio Code右下角状态栏里,会看到Go Live的按钮。选中一个html文件,点击该按钮: 即可主动关上浏览器,渲染该选中的html: Live Server提供了丰盛的配置项: https://github.com/ritwickdey... 应用命令 netstat -aon|findstr 5500, 查看Live server默认监听在5500端口号上: 过程id为 21008 命令行:C:\app\VSCode-1.48.2\Code.exe --inspect-port=0 c:\app\VSCode-1.48.2\resources\app\out\bootstrap-fork --type=extensionHost 更多Jerry的原创文章,尽在:"汪子熙":

April 6, 2021 · 1 min · jiezi

关于koa.js:koa的基本使用

1、初始化package.jsonnpm init2、装置koa2npm install koa3、hello代码ctx.body="hello"必须写,否则页面呈现Not Foundconst koa =require('koa')const app = new koa()app.use(async (ctx)=>{ ctx.body="hello"})app.listen(3000)4、代码运行批改代码时,必须从新运行index.js为须要运行的文件node index.js5、koa-static动态资源加载首先装置koa-static插件npm install koa-staticconst Koa = require('koa')const path = require('path')const static = require('koa-static')const app = new Koa()// 动态资源目录对于绝对入口文件index.js的门路const staticPath = './static'app.use(static( path.join( __dirname, staticPath)))app.use( async ( ctx ) => { ctx.body = 'hello world'})app.listen(3000, () => { console.log('[demo] static-use-middleware is starting at port 3000')})

April 6, 2021 · 1 min · jiezi

关于node.js:Nodejs-基础学习记录五

4. package.json文件4.1 node_modules文件夹的问题文件夹以及文件过多过碎,当咱们将我的项目整体拷贝给他人的时候,,传输速度会很慢很慢.简单的模块依赖关系须要被记录,确保模块的版本和以后保持一致,否则会导致以后我的项目运行报错4.2 package.json文件的作用我的项目形容文件,记录了以后我的项目信息,例如项目名称、版本、作者、github地址、以后我的项目依赖了哪些第三方模块等。应用npm init -y命令生成。 4.3 我的项目依赖在我的项目的开发阶段和线上经营阶段,都须要依赖的第三方包,称为我的项目依赖应用npm install 包名命令下载的文件会默认被增加到 package.json 文件的 dependencies 字段中 { "dependencies": { "jquery": "^3.3.1“ } } 4.4 开发依赖在我的项目的开发阶段须要依赖,线上经营阶段不须要依赖的第三方包,称为开发依赖应用npm install 包名 --save-dev命令将包增加到package.json文件的devDependencies字段中 { "devDependencies": { "gulp": "^3.9.1“ } } 4.5 package-lock.json文件的作用锁定包的版本,确保再次下载时不会因为包版本不同而产生问题放慢下载速度,因为该文件中曾经记录了我的项目所依赖第三方包的树状构造和包的下载地址,重新安装时只需下载即可,不须要做额定的工作5. Node.js中模块加载机制require('./find.js');require('./find');require办法依据模块门路查找模块,如果是残缺门路,间接引入模块。如果模块后缀省略,先找同名JS文件再找同名JS文件夹如果找到了同名文件夹,找文件夹中的index.js如果文件夹中没有index.js就会去以后文件夹中的package.json文件中查找main选项中的入口文件如果找指定的入口文件不存在或者没有指定入口文件就会报错,模块没有被找到5.2 模块查找规定-当模块没有门路且没有后缀时require('find');Node.js会假如它是零碎模块Node.js会去node_modules文件夹中首先看是否有该名字的JS文件再看是否有该名字的文件夹如果是文件夹看外面是否有index.js如果没有index.js查看该文件夹中的package.json中的main选项确定模块入口文件否则找不到报错

April 2, 2021 · 1 min · jiezi