关于node.js:微信每天自动给女男朋友发早安和土味情话

微信告诉,每天给女朋友发早安、情话、诗句、天气信息等~ 前言之前逛GitHub的时候发现了一个主动签到的小工具,b站、掘金等都能够,我看了下源码发现也是很简洁,也尝试用了一下,配置也都很简略,次要是他有一个主动打卡、抽奖的信息告诉到微信的性能,不错过运气爆棚打卡抽奖时的中奖~ 尽管以前做过钉钉的音讯告诉,然而钉钉我也就下班用一下,日常很少应用,要说通信工具在国内还是要微信,笑~,所以,第一接管信息告诉的工具最好能是微信,懂得都懂~ 起初我依据这个性能的逻辑一想,借用这个音讯告诉的能力,不就能够自定义任何内容推送到微信了吗,嘿嘿嘿,发现事件变的乏味了起来了~ 想起之前看过一篇文章是通过邮箱每天给女朋友发土味情话的操作,邮箱哪有微信成果好呀,可不是 话不多说间接开整,本人做个每天给女朋友发早安和土味情话的工具,你也能够每天都是暖男~ 思路接下来咱们次要做两件事: 第一件事:音讯告诉到微信能力的工具第二件事:音讯内容的获取和数据处理音讯告诉能力,我调研了下,其余计划或多或少都有限度和有余,采纳以上工具中的计划算是以后比拟适合的 音讯内容获取,一是通过凋谢API疾速应用,二是通过本人编写爬虫脚本获取,出于技术和工夫老本思考,目前优先思考计划一,计划二能够作为拓展能力 音讯告诉工具剖析wechaty文档:wechaty 能做到微信简直所有的性能和能力,当你有个小号微信时,你齐全能够把它交由 wechaty管制,再通过代码设计各种能力,可玩性齐全由你的想法决定 主动回复、加群、定时推送、回复、AI接口能力联合等等很多。。。 硬性条件是须要 wechaty官网提供的 token来获取权限,目前形式有两种 形式一:分割相干人员购买形式二:参加开发者打算,奉献我的项目并被驳回,收费提供相干文档:https://github.com/juzibot/We... 如果你有加过一些大佬的微信群,应该接触过由该能力实现的主动拉群、主动回复、主动每日播报的机器人钉钉、飞书、企业微信这三个工具定位都是企业级利用,企业级利用的益处就是可定制性很高,官网有凋谢提供很多API接口和权限,机器人、自定义利用、小程序等,可玩性还是蛮大的。 存在问题: 中国社交APP真实情况,排除企业组织应用,集体而言微信第一优先,不论是音讯告诉还是其余能力,但矛盾的中央是,集体微信限度很多,简直不提供这种开发API的能力。当然,如果你能够承受钉钉或飞书或企业微信,则不存在这种问题。 新的思路: 企业微信作为微信本人的产品,有着一些人造劣势:微信反对在微信内承受企业微信的音讯 围绕这个能力咱们也能够实现相应的性能需要,首先,咱们先在微信内关注咱们创立的企业微信,而后容许微信内承受企业微信内的音讯。 集体创立企业微信很简略,只需提供手机号即可 钉钉、飞书则应用机器人告诉 小结有条件优先应用 wechaty实现,没条件能够退而求其次采取 企业微信 + 微信 的形式。 筹备1.注册企业用电脑关上企业微信官网,注册一个企业。有手机号就能够注册,不必营业执照!不必营业执照!不必营业执照! 2.创立利用注册胜利后,点「治理企业」进入治理界面,抉择「利用治理」 → 「自建」 → 「创立利用」 利用名称随便填,可见范畴能够抉择公司名。 创立实现后进入利用详情页,能够失去利用ID( agentid ),利用Secret( secret )。 3.获取企业ID进入「我的企业」页面,拉到最下边,能够失去企业ID。 4.推送音讯到微信进入「我的企业」 → 「微信插件」,拉到下边扫描二维码,关注当前即可收到推送的音讯。 注:如果呈现接口申请失常,企业微信承受音讯失常,集体微信无奈收到音讯的状况: 1.进入「我的企业」 → 「微信插件」,拉到最下方,勾选 “容许成员在微信插件中接管和回复聊天音讯” 2.在企业微信客户端 「我」 → 「设置」 → 「新音讯告诉」中敞开 “仅在企业微信中承受音讯” 限度条件 5.增加环境变量在 Github 的 Secrets 中在增加三个变量: Name 是WX_APP_ID,Value 是第二步的 AgentId。Name 是WX_APP_SECRET,Value 是第二步 Secret。Name 是WX_COMPANY_ID,Value 是第三步的 企业ID。WX_COMPANY_ID= 企业IDWX_APP_ID= 利用IDWX_APP_SECRET= 利用 SecretTIAN_API_KEY= 天行数据 key6.GitHub Action每天主动执行外围代码如下,具体代码见上面仓库链接 ...

January 17, 2022 · 2 min · jiezi

关于node.js:关于项目中-Repository-层的思考

前言对于我的项目中是否须要 Repository 层?这个问题,如同没有必定的答案,上面是我的思考分享给大家,不喜勿喷。 Repository 的定位我了解 Repository 是个大仓库,外面能够有 MySQL、Redis、MongoDB ... 等数据。 保护这一层的开发者,能够称为 仓库管理员 ,当使用者须要查问数据的时候,须要通知仓库管理员,由仓库管理员拿给他,至于仓库管理员从哪拿的数据,使用者无需关系。 同理,当须要创立或更新数据的时候,也须要通知仓库管理员,由仓库管理员进行操作数据。 总结:Repository 次要是封装数据的查问、创立、更新、删除等逻辑,供使用者调用。 Repository 的实现可配置条件查问可配置数据转换可配置数据验证解释下 “可配置数据转换” :当咱们须要返回隐衷性字段时,例:如手机号,如果使用者无数据权限时,手机号字段两头 4 位须要进行加 * 解决,还有解决返回的工夫格局等。 如果你应用的是 Laravel 框架,能够参考下 andersao/l5-repository Repository 的接口Repository 层的接口能够了解为契约(可理解下 Laravel Contracts 目录),它是受 Domain 驱动的,Repository 中定义的性能要体现 Domain 的用意和束缚。Domain 须要什么我才提供什么,不须要的我不会提供。 例如,接口名能够定义为 searchUsersById 、searchUsersByName,不能够定义为 searchUsersByInfo,查问的字段也不倡议设置为 * ,仅查问须要的字段进行返回。 什么是 Domain?能够了解为畛域层。 小结应用 Repository 层有利有弊,弊病就是有些繁琐,没有 ORM 一把梭的顺畅。当然长处也有很多,次要是前期的可维护性大大提高。 列举一些长处: 更换、降级 ORM 引擎时,不影响业务逻辑;便于单元测试,可用 Mock 对象代替理论的数据库存取;以上,心愿对你可能有所帮忙。 最初如果你感觉此文对你有一丁点帮忙,点个赞。或者能够退出我的开发交换群:1025263163互相学习,咱们会有业余的技术答疑解惑 如果你感觉这篇文章对你有点用的话,麻烦请给咱们的开源我的项目点点star:http://github.crmeb.net/u/defu不胜感激 ! PHP学习手册:https://doc.crmeb.com技术交换论坛:https://q.crmeb.com

January 15, 2022 · 1 min · jiezi

关于node.js:使用-nodeconfig-在-Nodejs-中创建配置文件

治理跨不同环境的多个配置文件可能具备挑战性,并且有多种工具正试图用不同的办法解决这个问题。然而,在本文中,咱们将学习如何应用 node-config 跨不同部署环境创立和治理 Node.js 配置文件。 node-config是什么?Node-config容许你在你的Node应用程序中为不同的部署环境创立配置文件。有了它,你能够定义一个你打算跨环境重复使用的默认配置文件,而后将默认配置扩大到其余环境,如开发、暂存等。 你能够应用一些长期的命令行参数来笼罩这些参数,比方在你的命令行参数中退出NODE_ENV=development。 Node-config使创立和治理一个在所有部署环境中共享的统一的配置界面变得更加容易。 为了更好地了解如何设置这个配置,让咱们应用一个Node利用样本。首先,在你的终端上运行上面的命令来克隆这个资源库,或者从这里下载并解压它。 git clone https://github.com/ezesundayeze/node-env-sample要装置 Node 依赖项,请运行: npm install设置 node-config因为node-config是一个npm包,咱们能够通过运行这些命令中的任何一个来用npm或yarn装置它。 npm install config或者 yarn add config反对的 node-config 文件扩展名Node-config 反对许多文件扩展名。在公布时,以后版本的 node-config (3.3.6) 反对以下扩大: - .json- .json5- .hjson- .yaml or .yml- .coffee- .js- .cson- .properties- .toml- .ts- .xml这意味着你能够用任何一个反对的扩大来创立你的配置文件,但为你的项目选择一个扩大并在整个构建过程中保持应用它是有意义的。 在本教程中,咱们将应用 .json 扩展名。 创立默认环境变量创立一个 config 目录并向其中增加一个 config/default.json 文件。这将是默认配置文件,并将蕴含所有默认环境变量。 在咱们的示例应用程序中它应该是这样的: config/default.json { "server": { "host": "localhost", "port": 0, }}咱们将在咱们的应用程序中通过导入 config 和应用 get 办法拜访变量来拜访它。 const config = require('config');const port = config.get('server.port');const host = config.get('server.host');让咱们创立一个 server.js 文件并增加以下代码。 ...

January 13, 2022 · 2 min · jiezi

关于node.js:Egg框架应用Sequelize操作MySQL小结

Egg.js,是阿里开源的企业级 Node.js 框架。相比Express、Koa,Egg.js更为轻量,是Koa的加强,开发成本和效率也更为高效。 Sequelize,是一个宽泛应用的 ORM 框架,它反对 MySQL、PostgreSQL、SQLite 和 MSSQL 等多个数据源。 一、装置配置插件关上vscode终端装置egg-mysql,mysql2 npm install --save egg-sequelize mysql2在 config/plugin.js 中引入 egg-sequelize 插件 exports.sequelize = { enable: true, package: 'egg-sequelize',}在 config/config.default.js 中编写 sequelize 配置 config.sequelize = { dialect: 'mysql', host: '123.45.67.890', port: 3306, database: 'test', username: 'root', password: '123456', // 配置数据库工夫为东八区北京工夫 timezone: '+08:00', define: { // model的全局配置 timestamps: true, // 增加create,update,delete工夫戳 paranoid: true, // 增加软删除 freezeTableName: true, // 避免批改表名为复数 underscored: false // 避免驼峰式字段被默认转为下划线 }, // 打印日志 logging: true, // 工夫格式化 dialectOptions: { dateStrings: true, typeCast: true }};留神点1、日期显示格局异样默认状况下查问的日期是这种样子2022-01-02T09:14:03.102Z,咱们须要对它主动格式化才行。 ...

January 11, 2022 · 3 min · jiezi

关于node.js:一个基于json的快速建立websocket解决方案支持nodeweb可以自定义middleware

前端疾速建设和node建设websocket,应用json格局,反对中间件。示例如下,前后端疾速传递服务器工夫戳。联合redux几行代码即可将数据传递到react组件。github: https://github.com/stillyuk/j... serverlet websocketServer = new JsonWebsocketServer(8899)websocketServer.start()websocketServer.addTask(new ServerTimestampTask(websocketServer))websocketServer.use(middleware.ip)websocketServer.use(middleware.version)websocketServer.use(async (connInfo, clientData, next) => { if (clientData.token !== 'abc') { websocketServer.sendClient([connInfo], 'error', {errorCode: 1, errorMsg: 'login first'}) } else { await next() }})client import JsonWebsocketClient from '../src/JsonWebsocketClient.js' let client = new JsonWebsocketClient('ws:localhost:8899') client.addWatch('serverTimestamp', null, (a) => { console.log(a) }) client.addWatch('version', '1.0') client.addWatch('error', null, (data) => { console.log(data) })redux middleware and reducer//middlewareconst webSocketClient = new JsonWebsocketClient()export function wsUpdateType(type) { return type + '_ws_update'}export default () => next => async (action: any) => { if (!action.wsType) { return next(action) } if (action.wsType == 'close') { webSocketClient.close(action.data) return } webSocketClient.addWatch(action.wsType, action.data, (data) => { return next({ type: wsUpdateType(action.type), data: data }) })}//reducerfunction socket(type, value) { return (state = value, action) => { if (action.type == wsUpdateType(type)) { return action.data } return state }}

January 10, 2022 · 1 min · jiezi

关于node.js:node之请求管理器

当同时有很多申请发动时,会重大升高每个申请的响应速度,或导致接口申请失败,所以须要管制申请并发数,createRequestManage函数能够创立一个全局的申请管理器,治理申请,申请超过下限时,会将申请放入队列。 function createRequestManage(limit) { let currentTotal = 0 let todoList = [] return { schedule(callback) { if (currentTotal > limit) { todoList.push(callback) } else { currentTotal++ let next = () => { currentTotal-- if (todoList.length > 0) { let cb = todoList.shift() cb().finally(next) } } callback().finally(next) } } }}如何应用: const requestManage = createRequestManage(500)request.schedule(()=> { axios.get('').then(res=>{})})

January 9, 2022 · 1 min · jiezi

关于node.js:Express-工具库中的-Application-对象

var express = require('express')var app = express()app.get('/', function (req, res) { res.send('hello world')})app.listen(3000)下面是一个最简略的 express 利用的例子。Application 对象通常示意 Express 应用程序。通过调用express() 即 Express 模块导出的顶级函数来创立它。 Express 是一个路由和中间件 Web 框架,实质上是一系列中间件函数调用。 中间件函数是能够拜访申请对象( req)、响应对象( res) 和应用程序申请-响应循环中的下一个中间件函数的函数。下一个中间件函数通常由名为 next 的变量示意。 中间件性能能够执行以下工作: 执行任何代码。对申请和响应对象进行更改。完结申请-响应循环。调用堆栈中的下一个中间件函数。如果以后中间件函数没有完结申请-响应循环,它必须调用next() 将控制权传递给下一个中间件函数。否则,申请将被挂起。 Express 应用程序能够应用以下类型的中间件: Application-level middlewareRouter-level middlewareError-handling middlewareBuilt-in middlewareThird-party middleware将应用层中间件绑定到 app 对象的实例上,绑定通过 app.use 函数调用实现。app.METHOD 是解决 HTTP 申请的办法名,小写,比方 get, post, put 等等。 var express = require('express')var app = express()app.use(function (req, res, next) { console.log('Time:', Date.now()) next()})上述代码,console.log 在每次接管到 HTTP 申请时都会执行。 ...

January 9, 2022 · 1 min · jiezi

关于node.js:2022年你还不会serverless看看这篇保姆级教程中

本篇次要介绍serverless在小程序云开发的实际小程序传统开发模式前后台联调工夫有时候更多,等我的项目上线须要思考更多运维的问题,买域名买服务器等 云开发正在扭转小程序的开发模式云开发是什么 让开发者更专一于业务的开发,在云开发云函数中,咱们能够很不便获取小程序用户openId、unionId一些鉴权信息,加重后盾开发量云开发是一套综合类服务的技术产品,通常开发一个残缺的利用(小程序也好,Web、挪动利用也好)都须要数据库、存储、CDN、后端函数、动态托管、用户登录等等,然而云开发将这些服务都集成到了一起,而且以一种全新的开发方式,让开发一个利用更加疾速、不便、便宜且弱小,引领将来技术开发的新趋势。简略的说,就是云开发是一套综合类服务的技术产品,通常开发一个残缺的利用(小程序也好,Web、挪动利用也好)都须要数据库、存储、CDN、后端函数、动态托管、用户登录等等,然而云开发将这些服务都集成到了一起,而且以一种全新的开发方式,让开发一个利用更加疾速、不便、便宜且弱小,引领将来技术开发的新趋势。 咱们不须要辨别那局部是前端那局部是后端,咱们只须要调用函数一样去哪里这个流程就能够,云函数也能够在本地调式,调式云函数就像调式咱们的代码一样的云开发劣势 疾速上线更加专一咱们的业务独立开发一个残缺的小程序,云开发提供十分丰盛的接口,咱们通过这些接口很不便文件上传等操作不须要思考运维等问题,云开发是弹性扩容的数据更平安小程序云开发提供哪些根底能力 小程序云函数计费产品定价 反对地区 收费额度 每个月的收费额度,会在每月开始时刻重置,不会进行累积 配额限度阐明 小程序云开发我的项目的创立与配置 云开发我的项目初始化找到云开发的环境ID,点击云开发控制台窗口里的设置图标,在环境变量的标签页找到环境名称和环境ID。 用户在开明云开发之后就创立了一个云开发环境,微信小程序可领有最多两个环境,每个环境都对应一整套独立的云开发资源,包含数据库、云存储、云函数、动态托管等,各个环境是互相独立的。每个环境都有一个惟一的环境ID(环境名称不惟一)。 指定开发者工具的云开发环境 当云开发服务开明后,咱们能够在小程序源代码cloudfunctions文件夹名看到你的环境名称。如果在cloudfunctions文件夹名显示的不是环境名称,而是“未指定环境”,能够鼠标右键该文件夹,能够看到弹窗的第一项为“以后环境”,有个小三角,在这里能够抉择或切换曾经建好的云开发环境。如果环境为空白,重启开发者工具,再来抉择。 指定小程序的云开发环境 在开发者工具中关上源代码文件夹miniprogram里的app.js文件,找到如下代码: wx.cloud.init({ // env 参数阐明: // env 参数决定接下来小程序发动的云开发调用(wx.cloud.xxx)会默认申请到哪个云环境的资源 // 此处请填入环境 ID, 环境 ID 可关上云控制台查看 // 如不填则应用默认环境(第一个创立的环境) // env: 'my-env-id', traceUser: true,}) 在 env: ‘my-env-id’处改成你的环境ID,留神须要填入的是你的环境ID而不是环境名称哦,后果如下:// 因为云开发能够创立多个环境,比方微信小程序就能够创立两个收费的云开发环境,一个用于测试,一个用于正式公布。如果你没有在小程序端指定环境,会默认抉择为你创立的第一个云开发环境。咱们能够通过批改env的参数来切换小程序端用来调用的云开发环境。wx.cloud.init({ env: 'cloud1-2g12nyjfdh7f4caed9', // 云开发能力全局只须要初始化一次即可,这里的traceUser属性设置为true,会将用户拜访记录到用户治理中,在云开发控制台的经营剖析—用户拜访里能够看到拜访记录。 traceUser: true,})小程序云开发资源的治理小程序云开发控制台 腾讯云云开发网页控制台 咱们还能够应用腾讯云云开发网页控制台来治理云开发资源,须要留神两点,一个是登录形式须要抉择其余登录形式里的微信公众号,点击而后应用手机微信扫码,在微信上抉择你要登录的小程序;二是要进入腾讯云后盾之后切换抉择云开发Cloudbase。 其余工具与形式云开发资源还反对其余形式来调用 CloudBase CLI:咱们能够应用云开发提供的命令行工具 CloudBase CLI 对云开发环境外面的资源进行批量治理,比方云函数批量下载更新;云存储外面的文件夹批量下载和上传等等;Tencent CloudBase Toolkit:Tencent CloudBase Toolkit是一款Visual Studio Code的云开发插件,应用这个插件能够更好地在本地进行云开发我的项目开发和代码调试,并且轻松将我的项目部署到云端; 部署并上传云函数云函数的根目录与云函数目录 cloudfuntions文件夹图标里有朵小云,示意这就是云函数根目录。开展cloudfunctions,咱们能够看到外面有login、openapi、callback、echo等文件夹,这些就是云函数目录。而miniprogram文件夹则搁置的是小程序的页面文件cloudfunctions里放的是云函数,miniprogram放的是小程序的页面,这并不是变化无穷的,也就是说你也能够批改这些文件夹的名称,这取决于我的项目配置文件project.config.json里的如下配置项: ...

January 8, 2022 · 2 min · jiezi

关于node.js:jwt在node中的应用与实践

导语:因为http是无状态的,申请响应过程中不存储记录用户身份信息,所以就呈现了很多用户辨认存储用户身份的办法,比方cookie,session,jwt。我最近做的一个接口服务应用了jwt来存储管理用户信息,相较于本地cookie存储,服务器端session存储,jwt就变得比拟平安和节俭不便,本文就jwt在node服务中的应用办法做一个简略的总结。目录jwt简介装置配置封装办法实战练习本文从以上四个方面介绍jwt的应用。 jwt简介概念JWT全称JSON Web Token,它是一种凋谢规范RFC 7519,定义了一种紧凑且自蕴含的形式,用于在各方之间作为JSON对象平安地传输信息。JWT能够应用密钥或应用RSA或ECDSA的公钥/私钥对进行签名,能够对签名进行验证。 组成部分jwt签名令牌个别由三局部组成,别离是Header(头部信息),Payload(载荷),Signature(签名),例如xxxxx.yyyyy.zzzzz。 header个别是存储令牌的类型和签名算法,比方: { "alg": "HS256", "typ": "JWT"}Payload个别是存储申明,也就是用户信息和附件数据,分为注册申明、公共申明和私人申明。 比方: { "sub": "1234567890", "name": "John Doe", "admin": true}签名利用签名算法对Header和Payload进行签名 比方: HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)那么一个规范的jwt签名令牌会是这样的eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c。 利用场景用户受权拜访比方用户登录后,服务端下发一个jwt令牌给客户端,每次用户申请数据都在申请头外面携带此令牌,服务端验证通过后能够获取到数据,这种形式开销很小,并不需要服务端进行存储,而且还能够跨域应用。 信息替换在各方之间存储加密信息,验证签名内容是否篡改。 安全性因为令牌能够被拆解,外面的header和Payload能够被解析看到,所以尽量不要在Payload外面存储一些私密的信息。 装置配置上面就在node中应用jwt做一下操作。 在npm网站,有很多的jwt包,你能够抉择你认为适合的。 搜寻jwtNAME | DESCRIPTION | AUTHOR | DATE | VERSION | KEYWORDSjwt | JSON Web Token for… | =mattrobenolt | 2012-05-05 | 0.2.0 |express-jwt | JWT authentication… | =woloski… | 2021-08-11 | 6.1.0 | auth authn authentication authz authorization http jwt token oauth expressjsonwebtoken | JSON Web Token… | =dschenkelman… | 2019-03-18 | 8.5.1 | jwtjwt-decode | Decode JWT tokens,… | =jeff.shuman… | 2020-11-16 | 3.1.2 | jwt browserpassport-jwt | Passport… | =themikenichol… | 2018-03-13 | 4.0.0 | Passport Strategy JSON Web Token JWTkoa-jwt | Koa middleware for… | =stiang… | 2021-09-24 | 4.0.3 | auth authn authentication authz authorization http jwt json middleware token oauth permissions koajsrsasign | opensource free… | =kjur | 2021-12-01 | 10.5.1 | crypto cryptography Cipher RSA ECDSA DSA RSAPSS PKCS#1 PKCS#5 PKCS#8 private key public key CSR PKCS#10 hash function HMac ASN.1 certexpress-jwt-permissions | Express middleware… | =angryunicorn… | 2021-08-18 | 1.3.6 | express middleware JWT permissions authorization token securitynjwt | JWT Library for… | =robertjd | 2021-12-03 | 1.2.0 | jwtfastify-jwt | JWT utils for… | =starptech… | 2021-12-03 | 4.1.0 | jwt json token jsonwebtoken fastifydid-jwt | Library for Signing… | =simonas-notcat… | 2021-12-03 | 5.12.1 | hapi-auth-jwt2 | Hapi.js… | =nelsonic | 2020-09-08 | 10.2.0 | Hapi.js Authentication Auth JSON Web Tokens JWTauth0-lock | Auth0 Lock | =jeff.shuman… | 2021-11-02 | 11.31.1 | auth0 auth openid authentication passwordless browser jwtjwks-rsa | Library to retrieve… | =jeff.shuman… | 2021-10-15 | 2.0.5 | jwks rsa jwtrestify-jwt-community | JWT authentication… | =frbuceta | 2021-12-05 | 1.1.21 | auth authentication authorization http jwt token oauth restifydid-jwt-vc | Create and verify… | =simonas-notcat… | 2021-11-23 | 2.1.8 | jwt-service | A simple wrapper… | =nfroidure | 2021-11-01 | 8.0.0 | jwt knifecycleangular-jwt | Library to help you… | =jeff.shuman… | 2019-03-20 | 0.1.11 |@thream/socketio-jwt | Authenticate… | =divlo | 2021-07-23 | 2.1.1 | socket socket.io jwtappstore-connect-jwt-gene | [![NPM](https://nod… | =poad | 2021-10-15 | 1.0.1 | jwt appstorerator-core | 装置jwt我集体感觉这个jsonwebtoken很不错,本文就应用这个包。 ...

January 6, 2022 · 4 min · jiezi

关于node.js:nodejs-异步IO和事件驱动

异步IO(asynchronous I/O) 阻塞I/O 和 非阻塞I/O 阻塞I/O,就是当用户发一个读取文件描述符的操作的时候,过程就会被阻塞,直到要读取的数据全副筹备好返回给用户,这时候过程才会解除block的状态。 非阻塞I/O,就与下面的状况相同,用户发动一个读取文件描述符操作的时,函数立刻返回,不作任何期待,过程继续执行。然而程序如何晓得要读取的数据曾经筹备好了呢?最简略的办法就是轮询。 除此之外,还有一种叫做IO多路复用的模式,就是用一个阻塞函数同时监听多个文件描述符,当其中有一个文件描述符筹备好了,就马上返回,在linux下,select,poll,epoll都提供了IO多路复用的性能。 同步I/O 和 异步I/O 那么同步I/O和异步I/O又有什么区别么?是不是只有做到非阻塞IO就能够实现异步I/O呢? 其实不然。 同步I/O(synchronous I/O)做I/O operation的时候会将process阻塞,所以阻塞I/O,非阻塞I/O,IO多路复用I/O都是同步I/O。 异步I/O(asynchronous I/O)做I/O opertaion的时候将不会造成任何的阻塞。 非阻塞I/O都不阻塞了为什么不是异步I/O呢?前端培训其实当非阻塞I/O筹备好数据当前还是要阻塞住过程去内核拿数据的。所以算不上异步I/O。 这里借一张图(图来自这里)来阐明他们之间的区别 事件驱动 事件驱动(event-driven)是nodejs中的第二大个性,就是通过监听事件的状态变动来做出相应的操作。比方读取一个文件,文件读取结束,或者文件读取谬误,那么就触发对应的状态,而后调用对应的回掉函数来进行解决。 线程驱动和事件驱动 线程驱动编程和事件驱动编程之间的区别: 线程驱动就是当收到一个申请的时候,将会为该申请开一个新的线程来解决申请。个别存在一个线程池,线程池中有闲暇的线程,会从线程池中拿取线程来进行解决,如果线程池中没有闲暇的线程,新来的申请将会进入队列排队,直到线程池中闲暇线程。 事件驱动就是当进来一个新的申请的时,申请将会被压入队列中,而后通过一个循环来检测队列中的事件状态变动,如果检测到有状态变动的事件,那么就执行该事件对应的解决代码,个别都是回调函数。 对于事件驱动编程来说,如果某个工夫的回调函数是计算密集型,或者是阻塞I/O,那么这个回调函数将会阻塞前面所有事件回调函数的执行。这一点尤为重要。 nodejs的事件驱动和异步I/O 事件驱动模型 nodejs是单线程(single thread)运行的,通过一个事件循环(event-loop)来循环取出音讯队列(event-queue)中的音讯进行解决,处理过程基本上就是去调用该音讯对应的回调函数。音讯队列就是当一个事件状态发生变化时,就将一个音讯压入队列中。 nodejs的工夫驱动模型个别要留神上面几个点: 1.因为是单线程的,所以当程序执行js文件中的代码的时候,事件循环是被暂停的。 2.当js文件执行完当前,事件循环开始运行,并从音讯队列中取出音讯,开始执行回调函数 3.因为是单线程的,所以当回调函数被执行的时候,事件循环是被暂停的 4.当波及到I/O操作的时候,nodejs会开一个独立的线程来进行异步I/O操作,操作完结当前将音讯压入音讯队列。 不多说,看例子 var fs = require("fs");var debug = require('debug')('example1');debug("begin");fs.readFile('package.json','utf-8',function(err,data){ if(err) debug(err); else debug("get file content");});setTimeout(function(){ debug("timeout2");});debug('end'); // 运行到这里之前,事件循环是暂停的同步执行debug("begin")异步调用fs.readFile(),此时会开一个新的线程去进行异步I/O操作异步调用setTimeout(),马上将超时信息压入到音讯队列中同步调用debug("end")开启事件循环,弹出音讯队列中的信息(目前是超时信息)而后执行信息对应的回调函数(事件循环又被暂停)回调函数执行完结后,开始事件循环(目前音讯队列中没有任何货色,文件还没读完)异步I/O读取文件结束,将音讯压入音讯队列(音讯中含有文件内容或者是出错信息)事件循环获得音讯,执行回调程序退出。这里借一张图来阐明nodejs的事件驱动模型 这里最初要说的一点就是如何手动将一个函数推入队列,nodejs为咱们提供了几个比拟不便的办法: setTimeout() process.nextTick() setImmediate() 异步I/O nodejs中的异步I/O的操作是通过libuv这个库来实现的,蕴含了window和linux上面的异步I/O实现。

January 4, 2022 · 1 min · jiezi

关于node.js:使用express连接http

const express = require("express"); // 创立http实例const app = express(); app.use((req,res,next) => { console.log('申请开始...', req.method,req.url); next(); }) app.use((req,res,next) => { req.cookie = { userId: 'aaa111' } next()}) app.use('/api', (req,res,next) => { console.log('解决/api路由'); next();})app.get('/api', (req,res,next) => { console.log('get解决/api路由'); next();})app.post('/api', (req,res,next) => { console.log('post解决/api路由'); next();}); app.use((req, res, next) => { console.log('解决 404') res.json({ errno: -1, msg: '404 not fount' })}) app.listen(3000, () => { console.log('server is running on port 3000')})

December 31, 2021 · 1 min · jiezi

关于node.js:nodejs连接redis存储用户信息

const redis = require("redis") // 创立客户端const redisClient = redis.createClient('127.0.0.1')redisClient.on('error', err => { console.error(err)}) // 测试redisClient.set('myname', 'lilei', redis.print)redisClient.get('myname', (err, val) => { if(err) { console.error(err) return } console.log(val) redisClient.quit()})

December 31, 2021 · 1 min · jiezi

关于node.js:node性能指标一内存分析与管理

对于node的前言JavaScript运行在浏览器的沙盒中,他始终会受限于浏览器的中间层提供的能力。Node技术的呈现给前端工作关上了新的场面。毫无疑问,古代的前端工程化曾经离不开Node的利用了,而Node自身的设计是用作服务端语言,越来越多的前端团队,不再只将node局限于工程化利用,也开始去负责BFF层,比方SSR架构、数据适配、数据拼接裁剪、后端利用等。当作为服务端利用的时候,服务的【稳固】与【平安】是最重要的指标,提起性能指标 “首屏加载时长”、“可交互时长”等,这些每一个前端er都理解的h5性能指标。node用作服务端,有哪些性能指标是值得咱们留神的呢? 影响node服务的因素node用作服务端,相比拟前端工程而言,咱们须要关注的不仅仅是node本身的个性之外,还有依赖的服务器资源;如果依赖的服务器性能不好,node服务的性能必然也受到影响; 因而,咱们去思考node服务的性能问题时候,须要从两个大的方面去思考:一是node运行时会呈现的问题,二是服务器资源的性能 CPU内存磁盘I/O网络I/O本文次要剖析内存指标,以及内存透露的隐患排查 内存的限度node的贮存分为堆和栈,栈中存储根本数据类型,堆中寄存援用类型:对象与变量; 对于node存储来说,堆内存是整个内存的次要占用。咱们所关注的内存指标就是指堆内存的占用指标 个别的后端语言简直没有内存限度的问题。然而node是基于V8引擎,在对象调配上听从V8的形式,node通过Javascript应用内存是有限度的,在64位零碎最大内存为1.4G左右,32位零碎为0.7G左右; 之所以有内存的限度,一方面V8的设计之初是用于浏览器应用,这个限度的值对于个别网页来说是足够的。更深层的起因是V8的垃圾回收机制; 当咱们申明一个变量并赋值的时候,就会寄存在V8申请的堆内存中,当堆内存不够会持续申请内存,晓得达到内存的限度。如果超出限度,那么就会呈现内存透露的景象,呈现卡顿等景象;这里的内存指标是最不便去量化的,通过node提供process.memoryUsage()即可查看与理解 rss:过程占用的内存总量。heapTotal:堆内存申请的总量。<!----> heapUsed:理论堆内存使用量。\ 垃圾回收V8垃圾回收的根底是先将内存进行分代; 在V8中依照对象存活的工夫将内存的进行分代。 存活工夫短(可立刻回收的变量)的放入新生代,常驻内存(全局变量、无奈立刻去回收的变量)放入老生代; v8内存空间 = 新生代占用内存空间 + 老生代占用内存空间; node也提供了扩宽内存的办法,在启动node的时候,能够通过传递--max-old-space-size 和 --max-old-space-size来调整内存的大小,这两个对应裁减的值就是下面提到的老生代内存与新生代的内存值,这个调整一旦启动,就不可更改,除非再次启动。在V8内存受限制的时候,能够依照这个值进行放宽 node --max-old-space-size=1800 server.js // 1800Mb 即便有调整,咱们也不能全部都是用V8申请的内存,这源于v8的回收策略 目前的Node应用的是scavenge算法,它基于复制的形式实现垃圾回收,这在肯定的水平是有对内存资源的节约存在; 代码开发过程中,也能够按需应用global.gc()去被动触发垃圾回收,如果被动触发之后,查问heapUsed并没有降落,能够思考是内存透露的存在了 内存透露的剖析通过上述,如果堆内存达到了堆内存的指标,无奈再为新的变量/对象进行申请新内存的时候就是呈现内存透露的景象了。老生代的常驻内存是不会被V8回收的,即便是手动登程。代码中常见的几项不会被垃圾立刻回收,积攒过多会造成内存透露隐患: 全局变量援用闭包作用域内变量<!----> 模块的缓存一个内存透露的简略案例, 仅供学习内存剖析: 每次申请的时候会通过request传过来的的信息去数据库取数据,对读取的数据做了一层缓存,简略的示例代码如下: const { json } = require('express');const express = require('express');const { v4: uuid } = require('uuid');const app = express();function getDataBase() { const cache = {} return function(key) { if (cache[key]) return cache[key] let data = new Array(10000).fill('cache') cache[key] = data return data } }const dataBase = getDataBase()app.get('/memoryUsage', (req, res, next) => { let uid = uuid() let data = dataBase(uid) res.json({ msg: '内存数据', data: JSON.stringify({ data }) })})const port = 3100app.listen(port, () => { console.log(`Example app listening at http://localhost:${port}`)})通过wrk压测工具压测,你会发现申请数量一多,申请就挂掉了。 ...

December 30, 2021 · 1 min · jiezi

关于node.js:cors解决跨域问题

跨域问题其实跨域问题就是 这两家前缀不同所以叫跨域file:///D:/mss/public/index.htmlhttp://127.0.0.1 而百度搜寻多半是jsonp申请,他的坑在于只能GET想完满解决跨域就靠它了. cors第一步:装置 npm i cors第二步:引入 var cors = require("cors")app.use(cors())第三步:返回 const express = require('express')const app = express()var cors = require("cors")app.use(cors())app.post('/user', function(req, res) { res.send({ name: "常吉孔", age: 18 })})app.listen(3000, () => console.log(`Example app listening on por!`))申请形式jQueryVue axios我抉择了axios。因为我懒的去找CDN间接就cnpm i axios <template> <div id="app"> <button type="button" @click="ck">测试</button> </div></template><script> import axios from "axios" export default{ methods:{ ck() { axios.post("http://127.0.0.1:3000/user").then((res)=>{ console.log(res) }) } } }</script>

December 29, 2021 · 1 min · jiezi

关于node.js:10个Nodejs-开发人员必须使用的IDE

Node.js 是一种 JavaScript 应用程序框架,它是一种构建服务器端 Web 应用程序和网络应用程序的弱小技术。在 Node.js 开发中,Node IDE起着至关重要的作用,尤其是在全面反对你的 Node.js 利用程序开发过程方面。在这里,咱们将讨论一下在2021年中实用于 React 和 Node.js框架的最佳 IDE,任何 JavaScript 开发人员都不能错过它!1、Sublime Text这是Node.js 开发者社区最受欢迎的文本编辑器之一。它具备弱小的性能,包含拆分编辑和我的项目切换。此 IDE 最吸引人的性能之一是它为您的 Web 应用程序提供了无可比拟的响应能力。2 、Visual Studio Code咱们甚至须要对微软这个惊人的产品说些什么吗?该Node IDE 反对多种操作系统,如 Windows、Linux、macOS。此外,它还内置了对 JavaScript 框架的反对。然而,我认为 VSCode 的次要性能是其内置的 CLI、Git 集成和集成的终端拆分视图。3、Cloud 9这个基于云的 IDE 反对 Node.js 和一些风行的技术,如 PHP、Meteor 和 C++。这是最弱小的在线编辑器之一,可让您在单个平台上编译、运行和调试代码。此外,它还通过内置的图像编辑器和键绑定编辑器提供帮忙。4、IntelliJ IDEA不仅实用于Node,而且该 IDE 在波及 Angular、HTML5、Javascript 等各种技术时曾经证实了其能力。通过这个 IDE,Node.js 开发人员还能够利用代码辅助、语法高亮和编译等惊人的性能。此外,IntelliJ IDEA 的 JavaScript 调试器通过表达式评估和条件断点为您提供帮忙。5、Komodo IDE如果您正在寻找跨平台 IDE 反对,这是您的完满答案!Komodo IDE 为 Ruby、Javascript、PHP 以及最重要的 Node js 等技术提供服务。这个宽泛的 IDE 容许开发人员应用图形调试、代码智能、DOM 查看器和 Markdown 查看器。6、 Eclipse这种基于云的 Node IDE 因其 Eclipse Java 开发工具、Git 集成和源代码生成等性能而受到 Node.js 开发人员的青眼。如果您想通过 Node.js 构建 Web 应用程序,前端培训Eclipse 能够通过其良好的 Node.js 集成为您提供充沛的帮忙。7、WebMatrix这个基于cloud0的IDE是微软开发的产品。WebMatrix 为其用户提供内置模板、代码编译性能和云公布工具。此 IDE 的次要性能之一是其优化辅助和数据库。只管此工具有一个限度,即它仅实用于 Windows 开发人员。8 、Brackets这个IDE 在开发者社区十分有名,尤其是在 JavaScript 方面。它在 Node.js 开发人员中风行的起因是它在 Node.js 过程和 gulp 脚本方面体现得十分好。此外,它的拆分视图和 JS 调试器等性能也值得一试。9、 GitpodGitpod 是一个面向所有用户的开源平台。这个 IDE 提供了一个优良的操作系统环境来运行你的代码。它内置了对 TypeScript、JavaScript 和 npm、Node.js 等工具的反对。10、 Koding另一个优良的基于云的 IDE,使开发人员社区的 Node.js 开发过程更容易。Koding 出现对 Node.js、Ruby 和 PHP 等技术的反对。这个 IDE 有很多很棒的性能,比方主动缩进、键盘快捷键、代码折叠、可折叠笔等等。其内置的浏览器让用户无需在 Node.js 的开发构造上破费额定的精力总之,有一些十分好的抉择能够使您的Node.js 开发过程对于这项技术的各个方面都更加不便。 ...

December 28, 2021 · 1 min · jiezi

关于node.js:写一个-CLI-工具抓取奇舞周刊文章链接

引言前端er 应该都晓得奇舞周刊,这是一个技术类博客,下面汇聚了一大批优良博客作者投稿的技术类文章。我自己每隔几天就会去看看下面的文章,然而它的官网常常打不开,每次想看文章的时候还得一页一页的翻能力找到想看的文章。或者,有时候就想轻易找一篇文章看一看作为常识扩大或是温故知新。 基于阅读文章的便利性的思考,于是开始了本次 CLI 工具的摸索,这款工具的外围性能是以开发者的角度来疾速的找出奇舞周刊上公布的文章链接。 次要性能抓取全副文章链接随机 N 篇文章链接定时工作主动抓取抓取全副文章链接这个性能目标次要是抓取文章链接数据,为CLI 工具开发提供数据撑持,以及为后续开发关键词检索、文章内容爬取、文章举荐等性能做铺垫。 npx 75_action fetch文章数据本地缓存作为命令行工具应用时,从官网抓取数据的过程实测会耗费 20s+ 的工夫,因而采纳本地文件来缓存曾经抓取的文章数据。npx 75_action random <N> 命令执行实现后会自定缓存抓取数据到本地,缓存有效期为 24h。 随机 N 篇文章链接CLI 工具次要性能之一,运行命令即可随机返回 N 篇文章的数据。 npx 75_action random <N>定时工作主动抓取借助 Github Actions 配置定时工作,每天0 8 16点执行自定执行[[#抓取全副文章链接]]工作,并将抓取到的文章数据打包上传至 GitHub 可供下载应用。 方案设计获取文章数据 CLI 工具 缓存策略 性能实现文章数据抓取对应源码在这里查看:https://github.com/JohnieXu/7... 抓取奇舞周刊官网首页 HTML 并解析出文章汇合数据 function getCollections() { return fetch(homeUrl) .then(res => res.text()) .then(res => { if (!res) { return Promise.reject(new Error('获取网页内容失败')) } return cheerio.load(res) }) .then($ => { const list = $('ol.issue-list > li') const collections = list.map((i, l) => { const title = $(l).find('a').attr('title') const url = $(l).find('a').attr('href') const date = $(l).find('.date').attr('datetime') return { title, url, date } }) return collections })}抓取汇合 URL 页面的 HTML 并解析出汇合下文章数据 ...

December 26, 2021 · 3 min · jiezi

关于node.js:NodeJS加解密之Crypto

如果感觉文章不错,欢送关注、点赞和分享! 继续分享技术博文,关注微信公众号  前端LeBron 互联网时代,网络上的数据量每天都在以惊人的速度增长。同时,各类网络安全问题层出不穷。在信息安全重要性日益凸显的明天,作为一名开发者,须要增强对平安的意识,并通过技术手段加强服务的安全性。crypto模块的目标是为了提供通用的加密和哈希算法。用纯JavaScript代码实现这些性能不是不可能,但速度会十分慢。Nodejs用C/C++实现这些算法后,通过cypto这个模块裸露为JavaScript接口,这样用起来不便,运行速度也快。编码方式为什么信息传输须要编码? 在开发加密解密数据的时候碰到须要把加密好的字节数组转换成 String 对象用于网络传输的需要,如果把字节数组间接转换成 UTF-8 等编码方式的话必定会存在某些编码没有对应的字符(8bit只能示意128个字符),在编码和解析过程中会出错,不能正确地表白信息。这时就能够通过罕用的二进制数据编码形式 Base64 编码或者 Hex 编码来实现。 hex编码编码原理将一个8位的字节数据用两个16进制数示意进去 将8位二进制码从新分组成两个4位的字节其中一个字节的低4位是原字节的高4位,另一个字节的低4位是原数据的低4位高4位都补0,而后输入这两个字节对应的十六进制数字作为编码例子ASCII码:A(65)二进制码:0100 0001从新分组: 00000100 00000001十六进制: 4 1Hex编码:41就算原文件是纯英文内容,编码后内容也和原文齐全不一样,普通人难以浏览但因为只有16个字符,据说一些程序员大牛可能记下他们的映射关系,从而达到读hex编码和读原文一样的成果。另外,数据在通过hex编码后,空间占用变成了原来的2倍。 base64编码编码原理Base64编码是通过64个字符来示意二进制数据,64个字符示意二进制数据只能示意6位,所以它能够通过4个 Base64字符来示意3个字节,如下是Base64的字符编码表 举个Base64编码的例子,图就很浅显易懂了 字符串长度不是3的倍数时补0,也就是“=” 由64个字符组成,比hex编码更难浏览,但因为每3个字节会被编码为4个字符。 所以,空间占用会是原来的4/3,比hex要节俭空间。另外要留神的是,尽管Base64编码后的数据难以浏览,但不能将其作为加密算法应用,因为它解码都不须要你提供密钥啊 urlencode编码编码原理urlencode编码,看名字就就晓得是设计给url编码的对于a-z,A-Z,0-9,.,-和_ ,urlencode都不会做任何解决原样输入,而其它字节会被编码为%xx(16进制)的模式,其中xx就是这个字节对应的hex编码。 因为英文字符原样保留,对于以英文为主的内容,可读性最好,空间占用简直不变,而对于非英文内容,每个字节会被编码为%xx的3个字符,空间占用是原来的3倍,所以urlencode是一个对英文敌对的编码方案。 Hash摘要:将不固定长度的音讯作为输出Hash函数,生成固定长度的输入,这段输入称之为摘要 实用场景:敏感信息的校验和存储、验证音讯残缺 & 未被篡改 特点输入长度固定:输出长度不固定,输入长度固定(因算法而异,常见的有MD5、SHA系列)。运算不可逆:已知运算后果的状况下,无奈通过通过逆运算失去原始字符串。高度离散:输出的渺小变动,可导致运算后果差别微小。弱碰撞性:不同输出的散列值可能雷同。以MD5为例MD5(Message-Digest Algorithm)是计算机平安畛域宽泛应用的散列函数(又称哈希算法、摘要算法),次要用来确保音讯的残缺和一致性。 常见的利用场景:密码保护、下载文件校验等。 利用场景文件完整性校验:比方从网上下载一个软件,个别网站都会将软件的md5值附在网页上,用户下载完软件后,可对下载到本地的软件进行md5运算,而后跟网站上的md5值进行比照,确保软件的完整性密码保护:将md5后的明码保留到数据库,而不是保留明文明码,防止拖库等事件产生后,明文明码透露。防篡改:比方数字证书的防篡改,就用到了摘要算法。(当然还要联合数字签名等伎俩)简略的md5运算hash.digest([encoding])计算摘要。encoding能够是hex、base64或其余。如果申明了encoding,那么返回字符串。否则,返回Buffer实例。留神,调用hash.digest()后,hash对象就作废了,再次调用就会报错。 hash.update(data[, input_encoding])input_encoding能够是utf8、ascii或者其余。如果data是字符串,且没有指定 input_encoding,则默认是utf8。留神,hash.update()办法能够调用屡次。 const crypto = require('crypto');const fs = require('fs');const FILE_PATH = './index.txt'const ENCODING = 'hex';const md5 = crypto.createHash('md5');const content = fs.readFileSync(FILE_PATH);const result = md5.update(content).digest(ENCODING);console.log(result);// f62091d58876a322864f5a522eb05052密码保护后面提到,将明文明码保留到数据库是很不平安的 最不济也要进行md5后进行保留 比方用户明码是123456,md5运行后,失去输入:e10adc3949ba59abbe56e057f20f883e 这样至多有两个益处: 防外部攻打:网站开发者也不晓得用户的明文明码,防止开发者拿着用户明文明码干坏事,以这种模式来爱护用户的隐衷防内部攻打:如网站被黑客入侵,黑客也只能拿到md5后的明码,而不是用户的明文明码,保障了明码的安全性const crypto = require('crypto');const cryptPwd = (password) => { const md5 = crypto.createHash('md5'); return md5.update(password).digest('hex');}const password = '123456';const cryptPassword = cryptPwd(password);console.log(cryptPassword);// e10adc3949ba59abbe56e057f20f883e后面提到,通过对用户明码进行md5运算来进步安全性。 ...

December 22, 2021 · 4 min · jiezi

关于node.js:推荐一个Nodejs参数校验模块-minijoi

举荐一个Node.js参数校验模块 - minijoi初衷: 因为在应用 Joi 的时候,校验时每次都要写模式规定 string.trim().required() 等等。因为参数校验是频繁且必须的,写的越来越多,代码既不难看,也不好保护,模式规定也不好记忆,并且 joi throw 的谬误还须要独自去解决。所以对日常最罕用的校验,封装了joi的API,并且能够在调用的时候同时传入自定义的Error,应用 joi 敌对的报错堆栈提示信息 同时 throw 咱们自定义的Error, 无须再独自解决 joi 的 Error。所以就有了 miniJoi ,就是简略版的joi。 欢送提 Issue 和 PR , 代码的测试用例在tests目录下,写好测试用例,执行命令为: pnpm run coverage(举荐)npm run coverageyarn run coverage控制台会输入用例状况和代码覆盖率。开发者也能够对 miniJoi 进行二次开发,打造更合乎本人利用模块。 minijoiconst miniJoi = require('minijoi');miniJoi.requireAndNotEmptyForStr(value , options)options : { error : new Error("This is an Error") //私有 pattern : /^1[3456789]\d{9}$/ // email ID URL phone name mode : 'strict' //phone version : 'ipv6' //IP generation : 'first' //ID}敌对的堆栈提醒,在Joi的根底上,报错的同时把要校验的参数类型也一起通知给开发者,开发者能够分明的看到输出的值和类型, _original 字段的值就是输出的值,如下: ...

December 16, 2021 · 4 min · jiezi

关于node.js:Express

转自LPZ老师原生的 http 模块在某些方面体现不足以应答咱们的开发需要,所以咱们就须要应用框架来放慢咱们的开发效率,框架的目标就是提高效率,让咱们的代码更对立。在 Node 中,有很多 Web 开发框架,咱们这里以学习 Express 为主。 Express 介绍Express 是一个基于 Node.js 平台,疾速、凋谢、极简的 web 开发框架。作者:tjtj 集体博客出名的开源我的项目创建者和协作者Express、commander、ejs、co、Koa...曾经来到 Node 社区,转 Go 了知乎 - 如何对待 TJ 发表退出 Node.js 开发,转向 Go?丰盛的 API 反对,弱小而灵便的中间件个性Express 不对 Node.js 已有的个性进行二次形象,只是在它之上扩大了 Web 利用所需的基本功能有很多风行框架基于 ExpressExpress 官网Express 中文文档(非官方)Express GitHub 仓库起步装置参考文档:http://expressjs.com/en/start... # 创立并切换到 myapp 目录mkdir myappcd myapp# 初始化 package.json 文件npm init -y# 装置 express 到我的项目中npm i expressHello World参考文档:http://expressjs.com/en/start... // 0. 加载 Expressconst express = require("express");// 1. 调用 express() 失去一个 app// 相似于 http.createServer()const app = express();// 2. 设置申请对应的处理函数// 当客户端以 GET 办法申请 / 的时候就会调用第二个参数:申请处理函数app.get("/", (req, res) => { res.send("hello world");});// 3. 监听端口号,启动 Web 服务app.listen(3000, () => console.log("app listening on port 3000!"));根本路由参考文档:http://expressjs.com/en/start... ...

December 15, 2021 · 9 min · jiezi

关于node.js:如何Nodejs项目打包为一个可执行文件

如何将Node.js我的项目打包为一个可执行文件PKGpkg可将Node.js我的项目打包为一个独自的可执行文件,可在未装置Nodejs的机器上运行。反对win、linux等多零碎。pkg的打包原理简略来说,就是将js代码以及相干的资源文件打包到可执行文件中,而后劫持fs外面的一些函数,使它可能读到可执行文件中的代码和资源文件。用法pkg应用比较简单,执行下pkg -h就能够根本理解用法,根本语法是:pkg [options] <input> <input>能够通过三种形式指定: 1.一个脚本文件,例如pkg index.js;2.package.json,例如pkg package.json,这时会应用package.json中的bin字段作为入口文件;3.一个目录,例如pkg .,这时会寻找指定目录下的package.json文件,而后在找bin字段作为入口文件。 [options]中能够指定打包的参数:1.-t指定打包的指标平台和Node版本,如-t node6-win-x64,node6-linux-x64,node6-macos-x64能够同时打包3个平台的可执行程序;2.-o指定输入可执行文件的名称,但如果用-t指定了多个指标,那么就要用--out-path指定输入的目录;3.-c指定一个JSON配置文件,用来指定须要额定打包脚本和资源文件,通常应用package.json配置。 应用:在package.json中的pkg字段中指定打包参数,应用npm scripts来执行打包过程,例如: {..."scripts": {"build": "pkg index.js"}}对于我的项目中的配置文件解决,如环境变量等。因为这些配置文件会跟着不同的部署环境进行更改,所以为了不便更改,个别不心愿把配置文件打包到exe。为了防止pkg主动地将配置文件打包到exe中,代码中不要采纳__dirname, 而是采纳绝对于process.cwd()的办法读取: // 不举荐const config = require((path.join(__dirname, './config.js')) // 举荐const config = require(path.join(process.cwd(), './config.js'));

December 12, 2021 · 1 min · jiezi

关于node.js:node

Node介绍 base LPZ链接 https://www.yuque.com/lipengz... 链接2 https://lurongtao.gitee.io/fe... Node.js是JavaScript 运行时通俗易懂的讲,Node.js是JavaScript的运行平台Node.js既不是语言,也不是框架,它是一个平台浏览器中的JavaScript EcmaScript 根本语法ifvarfunctionObjectArrayBomDomNode.js中的JavaScript 没有Bom,DomEcmaScript在Node中这个JavaScript执行环境为JavaScript提供了一些服务器级别的API 例如文件的读写网络服务的构建网络通信http服务器构建与Chrome的V8引擎之上 代码只是具备特定格局的字符串引擎能够意识它,帮你解析和执行Google Chrome的V8引擎是目前公认的解析执行JavaScript代码最快的Node.js的作者把Google Chrome中的V8引擎移植进去,开发了一个独立的JavaScript运行时环境Node.js uses an envent-driven,non-blocking I/O mode that makes it lightweight and efficent. envent-driven 事件驱动non-blocking I/O mode 非阻塞I/O模型(异步)ightweight and efficent. 轻量和高效单线程 跨平台Node.js package ecosystem,npm,is the larget scosystem of open sourcr libraries in the world npm 是世界上最大的开源生态系统绝大多数JavaScript相干的包都寄存在npm上,这样做的目标是为了让开发人员更不便的去下载应用npm install jqueryJavaScript 长久以来始终被限度在浏览器的沙箱中运行, 它的能力取决于浏览器中间层提供的反对多少。 Node 将高性能的 V8 带到了服务器端,使 JavaScript 也能够开发出实时高性能的服务器。 在 Node 中,不再与 CSS 样式表,DOM 树打交道, 能够随便的拜访本地文件,搭建 WebSocket 服务器,连贯数据库等零碎级底层操作。 Node 不解决 UI,只关怀数据,无论是本地数据还是网络数据。 前后端编程对立,大大降低了前后端编程切换的代码。对于前端工程师而言,本人相熟的 JavaScript 现在居然能够在另一个中央大放异彩, 不谈其余起因,仅仅因为好奇,也值得去关注和探索它。Node 运行机制Node能做什么web服务器后盾命令行工具 ...

December 10, 2021 · 10 min · jiezi

关于node.js:ApacheCN-NodeJS-译文集-20211204-更新

Node API 开发入门指南 零、前言一、Node.js 简介二、构建 API——第 1 局部三、构建 API——第 2 局部React TypeScript Node 全栈开发 零、序言第一局部:了解 TypeScript 及其如何改良 JavaScript 一、了解 TypeScript二、摸索 TypeScript三、应用 ES6+ 个性构建更好的利用第二局部:应用 React 学习单页利用开发 四、学习单页利用概念以及 React 如何实现这些概念五、将 React 挂钩用于开发六、应用 CreateReactApp 和 Jest 测试设置咱们的我的项目七、学习 Redux 和 React 路由第三局部:应用 Express 和 GraphQL 了解 Web 服务开发 八、:应用 Node.js 和 Express 学习服务器端开发九、什么是 GraphQL?十、建设一个具备 TypeScript 和 GraphQL 依赖关系的 Express 我的项目十一、咱们将学习的内容——在线论坛利用十二、为咱们的在线论坛利用构建 React 客户端十三、应用 Express 和 Redis 设置会话状态十四、设置 Postgres 和 TypeForm 存储库层十五、集成 GraphQL 模式——第一局部十六、集成 GraphQL 模式——第二局部十七、将利用部署到 AWSJavaScript 区块链编程学习手册 ...

December 8, 2021 · 3 min · jiezi

关于node.js:Koa

Koanpm init -ynpm i koa2 --Spackage.json 配置启动脚本 "start": "node app.js"npm i nodemon -g "start": "nodemon app.js"app.use 参数是中间件,将中间件增加至利用。作用就是调用中间件app.use 返回this 也就是app自身中间件常常应用asyncctx.body === ctx.response.body没有webpeck 翻译请不要应用import 洋葱模型与express 不同 express是所有中间件程序执行完结后响应.koa遇见next后会跳出以后中间件,执行下一个中间件,直到没有next 而后回到上一个中间件执行next之后的代码,直到第一个 app.use(async (ctx, next)=> { console.log(1); ctx.body='222'; await next(); // 想输入1 必须期待下面的next完结 记得画图 console.log(1); }) .use(async (ctx, next)=> { console.log(2); await next() console.log(2); }) .use(async (ctx, next)=> { console.log(3); await next() console.log(3); })//输入 1 2 3 2 1中间件1) 路由中间件 npm i koa-router // app 入口文件const Koa = require('koa2');const Router = require('koa-router');// 申明利用const app = new Koa();const router = new Router();router.get('/', async ctx => { ctx.body = 'router'})// 注册中间件 router.routes()启动路由 router.allowedMethods()容许任意申请app.use(router.routes(), router.allowedMethods()) .listen (9000,()=>{ console.log('serve start.....111'); })2) 路由重定向 ...

December 8, 2021 · 1 min · jiezi

关于node.js:node事件循环Event-loop

原文地址:node事件循环(Event loop) 本文将简述node事件循环的机制,帮忙咱们了解node环境中代码是如何运行的。 1.node运行机制node应用V8作为js解析引擎,I/O解决应用了本人设计的libuv,libuv是一个基于事件的跨平台形象层,封装了不同操作系统一些底层个性,对外提供对立的API,事件循环机制也是它外面的实现。 运行机制: ① V8引擎解析JavaScript脚本。 ② 解析后的代码,调用Node API。 ③ libuv库负责Node API的执行。它将不同的任务分配给不同的线程,造成一个Event Loop(事件循环),以异步的形式将工作的执行后果返回给V8引擎。 ④ V8引擎再将后果返回给用户。 2.事件循环libuv引擎中的事件循环分为 6 个阶段,循环运行。 每个阶段都有一个 FIFO 队列来执行回调。每当进入新阶段的时候,都会从对应的回调队列中取出函数去执行,当队列为空或者执行的回调数量达到零碎设定的阈值,就会进入下一阶段。 流程如下: ┌───────────────────────────┐┌─>│ timers ││ └─────────────┬─────────────┘│ ┌─────────────┴─────────────┐│ │ pending callbacks ││ └─────────────┬─────────────┘│ ┌─────────────┴─────────────┐│ │ idle, prepare ││ └─────────────┬─────────────┘ ┌───────────────┐│ ┌─────────────┴─────────────┐ │ incoming: ││ │ poll │<─────┤ connections, ││ └─────────────┬─────────────┘ │ data, etc. ││ ┌─────────────┴─────────────┐ └───────────────┘│ │ check ││ └─────────────┬─────────────┘│ ┌─────────────┴─────────────┐└──┤ close callbacks │ └───────────────────────────┘ ① 定时器(timers):本阶段执行曾经被 setTimeout() 和 setInterval() 的回调函数。 ...

December 8, 2021 · 1 min · jiezi

关于node.js:带你重新认识Node

写作不易,未经作者容许禁止以任何模式转载!如果感觉文章不错,欢送关注、点赞和分享!继续分享技术博文,关注微信公众号  前端LeBron原文链接最后做Node的目标是什么?Node作者Ryan Dahl: 基于V8创立一个轻量级的高性能Web服务器并提供一套库 为什么是JavaScript?Ryan Dahl是一名资深的C/C++程序员,发明出Node之前次要工作是围绕Web高性能服务器进行的 他发现Web高性能服务器的两个要点: 事件驱动非阻塞I / ORyan Dahl也曾评估过应用C、Lua、Haskell、Ruby等语言作为备选实现,得出以下论断: C的开发门槛高,能够预感不会有太多的开发者能将它用于业务开发Ryan Dahl感觉本人还不足够玩转Haskell,所以舍弃它Lua本身曾经含有很多阻塞 I / O 库,为其构建非阻塞 I / O 库不能扭转开发者应用习惯Ruby的虚拟机性能不佳JavaScript的劣势: 开发门槛低在后端畛域没有历史包袱第二次浏览器大战慢慢分出高下,Chrome浏览器的JavaScript引擎V8摘得性能第一的桂冠Node给JavaScript带来的意义 除了HTML、Webkit和显卡这些UI相干技术没有反对外,Node的构造与Chrome十分相似。他们都是基于事件驱动的异步架构:浏览器通过事件驱动来服务界面上的交互Node通过事件驱动来服务 I / O在Node中,JavaScript还被赋予了新的能力:得心应手地拜访本地文件搭建WebSocket服务端连贯数据库,进行业务研发像Web Worker一样玩转多过程Node使JavaScript能够运行在不同的中央,不再限度在浏览器中、DOM树打交道。如果HTTP协定是水平面,Node就是浏览器在协定栈另一边的倒影。 Node不解决UI,但用与浏览器雷同的机制和原理运行,突破了JavaScript只能在浏览器中运行的场面。前后端编程环境对立,能够大大降低前后端转换所须要的上下文代价。 Node的特点异步I / O以读取文件为例 var fs = require('fs'); fs.readFile('/path', function (err, file) { console.log('读取文件实现') }); console.log('发动读取文件'); 相熟的用户必晓得,“读取文件实现”是在“发动读取文件”之后输入的 fs.readFile后的代码是被立刻执行的,而“读取文件实现”的执行工夫是不被预期的 只晓得它将在这个异步操作后执行,但并不知道具体的工夫点 异步调用中对于后果值的捕捉是合乎“Don't call me, I will call you”准则的 这也是重视后果,不关怀过程的一种体现 Node中,绝大多数操作都以异步的形式进行调用,Ryan Dahl排除万难,在底层构建了很多异步I / O的API,从文件读取到网络申请等。使开发者很已从语言层面很天然地进行并行I / O操作,在每个调用之间无需期待之前的I / O调用完结,在编程模型上能够极大晋升效率 注:异步I / O机制将在下文中具体论述事件与回调函数事件 随着Web2.0的到来,JavaScript在前端负责了更多的职责,工夫也失去了宽泛的利用。将前端浏览器中广泛应用且成熟的事件与回到函数引入后端,配合异步I / O ,能够很好地将事件产生的工夫点裸露给业务逻辑。 ...

December 7, 2021 · 3 min · jiezi

关于node.js:各位frontend-developer们时机已经成熟让我们开始用上pnpm吧

pnpm是啥?全称performant npm(高性能的npm),见名知意,就是一个npm的替代品,至于为什么高性能,用什么样的形式解决了依赖包体积趋近于黑洞的问题,比这yarn有什么改良,曾经有官网文档有数大佬的解读了,我就不再罗里吧嗦再说一遍了,总之就是又快又好有省空间又省工夫又平安!你说咱有啥理由不必呢? 为什么说当初是时机成熟的时刻因为nodejs的v16.13.0版本和v16.13.1版本曾经是LTS(长期保护版)了,为什么提到这两个版本,因为自16.13之后的版本内置了实验性的工具corepack,corepack是啥? 看文档啊!不想看的我来给你简略介绍下:就是nodejs内置的一个治理包管理器的一个货色 别急,我再艰深的给你解释一下,你看咱们平时开发的时候装置依赖都会用到啥 1. npm 2. yarn 3. pnpm 4. ... 是不是很乱?除了nodejs默认自带的npm,别的你是不是还得全局装置下? 这个corepack就是自nodejs v16.13版本之后默认自带的一个工具,专门用来治理这些装置依赖的这些个工具,最重要的时还自带pnpm好家伙! 怎么用上呢?首先如果你没有装nvm请先装一个nvm,用来保留之前的node版本,不要问我nvm是啥 nvmlinux和osx用户的文档 win用户的文档 nvm降级如果你是windows用户并且你之前就装置了nvm-windows,想要用corepack治理pnpm,还须要把你的nvm-windows降级到1.1.8版本,因为这个版本能力反对corepack 如果你不是windows,间接看nvm文档中的Install & Update Script的局部降级一下或者装置一下,source一下你的bash/zsh的配置文件就好了 晓得怎么降级的、踩过这个坑的能够跳过了 下载安装升级包首先在仓库的releases页面找到1.1.8版本的,而后找到名为nvm-update.zip的文件,下载解压之后运行外面的nvm-update.exe就能够了 踩坑在这之前如果你应用nvm装置了16.13及以上版本的nodejs,请先卸载,而后右键你的开始菜单找到Windows PowerShell(管理员)点击,之后再通过 nvm install 16.13.1装置最新的LTS版本,截至发文,当初最新的LTS版本为16.13.1,大家看状况装置!装置实现之后: nvm use 16.13.1切换到指定版本,接着依照pnpm官网的文档,先把实验性的corepack开启 corepack enable通常corepack中的包管理器版本都不是最新的所以咱们要降级到最新,对于最新的pnpm版本号,能够去npmjs官网去看,截至发文,最新版本是6.23.6 corepack prepare pnpm@6.23.6 --activate功败垂成此时你就能够pnpm install/dev/build了,gym,腾飞 唉 腾飞~ 如果有其余装置过程中的问题,欢送大家留言探讨!

December 4, 2021 · 1 min · jiezi

关于node.js:mac-安装指定版本的node

传统计划:装置指定的node包一、找到历史node版本https://nodejs.org/zh-cn/down... 二、下载mac的安装包并装置 pkg文件 三、测试是否装置胜利node -v其余计划:应用nvm 装置多个node版本

November 30, 2021 · 1 min · jiezi

关于node.js:CabloyJS-412震撼发布及新版教程尝鲜

引言但凡能够用 JavaScript 来写的利用,最终都会用 JavaScript 来写 | Atwood 定律目前市面上呈现的大多数与 NodeJS 相干的框架,根本都将 NodeJS 定位在工具层、中间层、代理层,很少在业务层面进行深耕,认为这是 JAVA 的畛域,NodeJS 不适宜。这种思潮显著是与Atwood 定律相悖的 如果您想感触不同凡响的 NodeJS 全栈开发体验,肯定要试试自带工作流引擎的 CabloyJS 全栈开源框架。为了晋升业务层面的开发效率和开发体验,CabloyJS 在前端和后端均提供了大量实用的工具和组件 CabloyJS 4.12CabloyJS从4.11降级到4.12,历时5个月,Github提交数从6000+一路干到8000+,这次的性能更新相对是诚意满满,一次爽到爆 新增个性 数据:减少 simple 模式 默认的业务数据都具备生命周期,即三个阶段:草稿、正式、历史。草稿到正式之间还能够退出审批流新增的simple模式,就是能够简化业务数据的生命周期,只保留正式版本,从而满足一些简略业务数据的治理脏标记机制:所有Form表单均反对脏标记机制。当有字段值变动时,Form表单题目就会有醒目提醒,并且当敞开以后表单页面时,也会提醒用户表单数据没有保留测试:减少新的测试模块test-note 演示数据列表的布局切换:列表/卡片/表格演示数据条目的布局切换:信息/注释(Markdown)演示如何减少便签部件,从而能够在仪表板中间接编辑和查看便签数据测试:test-party 模块 演示如何减少简略聊天部件,从而能够在仪表板中进行间接的聊天互动工作流引擎: 减少转办减少代办工作流引擎: 减少行为机制:从而实现与 activiti 中边界事件所对应的利用场景 一个节点能够附加多个行为行为能够指定专属的边,从而进行节点的迁徙减少一个具体的行为实现: 超时解决 能够指定某个审批节点的超时行为,一旦超时就跳转到指定的流程节点工作流引擎: 减少网关节点,包含: 排他网关并行网关蕴含网关数据字典: 反对版本控制反对对字典独自受权反对多级树形字典内置:美国城市区划、中国城市区划通用的后端逻辑解决通用的前端渲染组件加强 Markdown:实现了一个所见即所得的Markdown富文本编辑器,相对好用,肯定要体验一下JSON:重构了带格式化的JSON编辑器文档与教程:随同着CabloyJS 4.12新版性能的推出,还全新制作了一套教程。为了体现CabloyJS低代码的开箱即用和业余代码的灵便定制,教程也由浅到深相应的分为几个局部: 教程:业务表单与审批流教程:博客教程:文档教程:社区教程:第三方平台进阶演示站点通过这套教程,能够让咱们更快的理解CabloyJS的开发格调,以及能够用来做哪些事件。欢送大家尝鲜、拍砖 也能够在浏览教程的同时,间接浏览CabloyJS的演示站点,减少更直观的理性认知 演示站点:https://test.cabloy.com/为了体验不同凡响的pc=mobile+pad自适应布局格调,肯定要别离用PC和Mobile独自体验演示站点。此言不虚,请您品鉴!!! 演示站点的二维码:

November 29, 2021 · 1 min · jiezi

关于node.js:AutoTinyPng从程序员的角度来压缩图片

Dear,大家好,我是“前端小鑫同学”,长期从事前端开发,安卓开发,热衷技术,在编程路上越走越远~前言:说来很奇怪,当初的不少技术交换群外面存在这一些“伪程序员”,就比如说下图的这段对话,用在线的图片压缩网站要对本人的大量图片进行压缩,竟然嫌麻烦都跑群外面问要怎么办? 从程序员的角度来解决这个问题:下班摸鱼法:一张一张来,干一张算一张。土豪氪金法:通过网站凋谢的API进行简略编程进行批量解决,当然你解决的越多就须要领取一些费用。展现技术法:适宜在正当的数量内,难得的机会中温习一下你的编程常识,还能把活干好。其余:。。。 打码前的筹备:咱们抉择展现技术法来做明天的Demo,我也感觉这是一个程序员的抉择(丢给美工的事我。。。);一款产品的品质也是须要逐步进行打磨优化,tinypng在程序员两头还是流传的较为好用的一款产品,咱们仍然抉择tinypng,用他人业余的工具做本人的事,丑陋!。 思路介绍:递归获取本地文件夹里的文件过滤文件,格局必须是.jpg .png,大小小于5MB.(文件夹递归)每次只解决一个文件(能够绕过20个的数量限度)解决返回数据拿到近程优化图片地址取回图片更新本地图片纯node实现不依赖任何其余代码片段 打码实现:仅实用Node提供的模块:const fs = require("fs");const { Console } = require("console");const path = require("path");const https = require("https");const URL = require("url").URL;通用浏览器标识,避免同一标识被服务器拦挡:const USER_AGENT = [ "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50", "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv,2.0.1) Gecko/20100101 Firefox/4.0.1", "Mozilla/5.0 (Windows NT 6.1; rv,2.0.1) Gecko/20100101 Firefox/4.0.1", "Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; en) Presto/2.8.131 Version/11.11", "Opera/9.80 (Windows NT 6.1; U; en) Presto/2.8.131 Version/11.11", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; maxthon 2.0)", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SE 2.X MetaSr 1.0; SE 2.X MetaSr 1.0; .NET CLR 2.0.50727; SE 2.X MetaSr 1.0)",];定义log,反对输入日志到文件:// 定义log,反对输入日志到文件class Log { options = { flags: "a", // append模式 encoding: "utf8", // utf8编码 }; logger = {}; /*** 初始化打印配置*/ constructor() { this.logger = new Console({ stdout: fs.createWriteStream("./log.tinypng.stdout.log", this.options), stderr: fs.createWriteStream("./log.tinypng.stderr.log", this.options), }); } /*** log级别* @param {*} message 输入信息*/ log(message) { if (message) { this.logger.log(message); console.log(message); } } /*** error级别* @param {*} message 输入err信息*/ error(message) { if (message) { this.logger.error(message); console.error(message); } }}// 实例化Log对象const Tlog = new Log();定义TinyPng对象:class TinyPng { // 配置信息: 后缀格局和最大文件大小受接管限度不容许调整 config = { files: [], entryFolder: "./", deepLoop: false, extension: [".jpg", ".png"], max: 5200000, // 5MB == 5242848.754299136 min: 100000, // 100KB }; // 胜利解决计数 successCount = 0; // 失败解决计数 failCount = 0; /*** TinyPng 结构器* @param {*} entry 入口文件* @param {*} deep 是否递归*/ constructor(entry, deep) { console.log(USER_AGENT[Math.floor(Math.random() * 10)]); if (entry != undefined) { this.config.entryFolder = entry; } if (deep != undefined) { this.config.deepLoop = deep; } // 过滤传入入口目录中合乎调整的待处理文件 this.fileFilter(this.config.entryFolder); Tlog.log(`本次执行脚本的配置:`); Object.keys(this.config).forEach((key) => { if (key !== "files") { Tlog.log(`配置${key}:${this.config[key]}`); } }); Tlog.log(`期待解决文件的数量:${this.config.files.length}`); } /*** 执行压缩*/ compress() { Tlog.log("启动图像压缩,请稍等..."); let asyncAll = []; if (this.config.files.length > 0) { this.config.files.forEach((img) => { asyncAll.push(this.fileUpload(img)); }); Promise.all(asyncAll) .then(() => { Tlog.log( `处理完毕: 胜利: ${this.successCount}张, 成功率${ this.successCount / this.config.files.length }` ); }) .catch((error) => { Tlog.error(error); }); } } /*** 过滤待处理文件夹,失去待处理文件列表* @param {*} folder 待处理文件夹* @param {*} files 待处理文件列表*/ fileFilter(folder) { // 读取文件夹 fs.readdirSync(folder).forEach((file) => { let fullFilePath = path.join(folder, file); // 读取文件信息 let fileStat = fs.statSync(fullFilePath); // 过滤文件安全性/大小限度/后缀名 if ( fileStat.size <= this.config.max && fileStat.size >= this.config.min && fileStat.isFile() && this.config.extension.includes(path.extname(file)) ) { this.config.files.push(fullFilePath); } // 是都要深度递归解决文件夹 else if (this.config.deepLoop && fileStat.isDirectory()) { this.fileFilter(fullFilePath); } }); } /*** TinyPng 近程压缩 HTTPS 申请的配置生成办法*/ getAjaxOptions() { return { method: "POST", hostname: "tinypng.com", path: "/web/shrink", headers: { rejectUnauthorized: false, "X-Forwarded-For": Array(4) .fill(1) .map(() => parseInt(Math.random() * 254 + 1)) .join("."), "Postman-Token": Date.now(), "Cache-Control": "no-cache", "Content-Type": "application/x-www-form-urlencoded", "User-Agent": USER_AGENT[Math.floor(Math.random() * 10)], }, }; } /*** TinyPng 近程压缩 HTTPS 申请* @param {string} img 待处理的文件* @success {* "input": { "size": 887, "type": "image/png" },* "output": { "size": 785, "type": "image/png", "width": 81, "height": 81, "ratio": 0.885, "url": "https://tinypng.com/web/output/7aztz90nq5p9545zch8gjzqg5ubdatd6" }* }* @error {"error": "Bad request", "message" : "Request is invalid"}*/ fileUpload(imgPath) { return new Promise((resolve) => { let req = https.request(this.getAjaxOptions(), (res) => { res.on("data", async (buf) => { let obj = JSON.parse(buf.toString()); if (obj.error) { Tlog.log(`压缩失败!\n 以后文件:${imgPath} \n ${obj.message}`); } else { resolve(await this.fileUpdate(imgPath, obj)); } }); }); req.write(fs.readFileSync(imgPath), "binary"); req.on("error", (e) => { Tlog.log(`申请谬误! \n 以后文件:${imgPath} \n, ${e}`); }); req.end(); }).catch((error) => { Tlog.log(error); }); } // 该办法被循环调用,申请图片数据 fileUpdate(entryImgPath, obj) { return new Promise((resolve) => { let options = new URL(obj.output.url); let req = https.request(options, (res) => { let body = ""; res.setEncoding("binary"); res.on("data", (data) => (body += data)); res.on("end", () => { fs.writeFile(entryImgPath, body, "binary", (err) => { if (err) { Tlog.log(err); } else { this.successCount++; let message = `压缩胜利 : 优化比例: ${( (1 - obj.output.ratio) * 100 ).toFixed(2)}% ,原始大小: ${(obj.input.size / 1024).toFixed( 2 )}KB ,压缩大小: ${(obj.output.size / 1024).toFixed( 2 )}KB ,文件:${entryImgPath}`; Tlog.log(message); resolve(message); } }); }); }); req.on("error", (e) => { Tlog.log(e); }); req.end(); }).catch((error) => { Tlog.log(error); }); }}module.exports = TinyPng;入口脚本:/** * 因网络起因和第三方接口防刷等技术限度导致局部图像处理失败 */const TinyPng = require("./tinypng.compress.img");function getEntryPath() { let i = process.argv.findIndex((i) => i === "-p"); if (process.argv[i + 1]) { return process.argv[i + 1]; }}new TinyPng(getEntryPath(), true).compress();执行演示: ...

November 27, 2021 · 4 min · jiezi

关于node.js:nodejs

https://www.isvee.com/archive...

November 26, 2021 · 1 min · jiezi

关于node.js:Nodejs中CommonJS和ECMAScript有什么区别

一、CommonJS 与 ECMAScript1、概念阐明CommonJS 与 ECMAScript 都是编写 JS 的规范。ECMAScript 规范让不同浏览器上执行雷同 js 代码能失去雷同后果,是现有 js语言 的通用规范。CommonJS 规范让雷同 js 代码在 Node.js 环境下运行失去雷同后果,只是 Node.js 下的规范。2、区别是什么?Node.js 既反对 CommonJS 规范,也齐全反对 ECMAScript 规范。Node.js 环境下用 js语言编写的文件,有三种格局:.js、.mjs、.cjs。 .mjs :此类文件只用能 ECMAScript 规范解析执行;.cjs :此类文件只用能 CommonJS 规范解析执行;.js : 依据具体情况决定,采纳什么规范来执行: 状况1:如果 .js 没有其余非凡阐明,默认应用 CommonJS 规范解析执行;状况2:package.json 文件中 type 属性值为缺省值 或 等于 commonjs ,那么采纳 CommonJS 规范解析执行 .js 文件;如果 type 属性等于 module,那么采纳 ECMAScript 规范解析执行 .js 文件。状况3:命令行中有flag ,--input-type=module 示意采纳 ECMAScript 规范解析执行 .js 文件;--input-type=commonjs 示意采纳 CommonJS 规范解析执行 .js 文件。 ...

November 26, 2021 · 2 min · jiezi

关于node.js:Nodejs的内置模块说明

一、Node.js 内置模块(Module)Node.js 内置模块是 Node.js 的顶层API,提供给了拜访网络、操作文件等外围性能,npm 外面的模块库就是基于这些顶层 API 的进一步封装,实现更便捷的性能。 1、查看内置模块创立 example.js 文件,复制上面代码到文件,终端运行 node example.js ,就能够看到 Node.js 内置的所有模块名。 // example.jsconst m = require('module');console.log("\r\n\r\n************************");console.log("require('module') :", m);const builtin = m.builtinModules;console.log("\r\n\r\n************************");console.log("builtin :", builtin);2、内置模块能够被批改,但不能新增和删除用内置模块 fs 作为测试对象,通过批改、删除、新增其内容,之后进行同步,最初用动静导入的形式,导入新的 fs ,进行前后比照。查看形式:创立 example.js 文件,复制上面内容到文件,终端运行 node example.js 看后果,如果 assert 的断言有谬误,会抛出谬误,否则没有任何输入。 // example.jsconst fs = require('fs');const assert = require('assert');const { syncBuiltinESMExports } = require('module');function newAPI() { // ...}// 批改fs.readFile = newAPI;// 删除delete fs.readFileSync;// 新增fs.newAPI = newAPI;// 同步syncBuiltinESMExports();import('fs').then((esmFS) => { // 批改的内容被同步了 assert.strictEqual(esmFS.readFile, newAPI); // 删除操作的确胜利了 assert.strictEqual('readFileSync' in fs, false); // 删除的内容,在新的模块中仍然存在 assert.strictEqual('readFileSync' in esmFS, true); // 新增内容,在新模块中不存在 assert.strictEqual(esmFS.newAPI, undefined);});二、参考文档Node.js的内置模块阐明!

November 26, 2021 · 1 min · jiezi

关于node.js:Nodejs的安装及环境配置

一、nvm是啥?不同应用程序须要不同版本的 Node.js,切换和装置新版本 Node.js 很烦人,还会有莫名其妙的问题。nvm就是来解决 Node.js 的装置和版本切换等问题。 二、装置 nvmnvm装置的形式有很多,详见上面的官网文档,这里选用 Git install ,能够解决443谬误问题。怎么装置git,看这里! 1、装置步骤cd ~/git clone https://github.com/nvm-sh/nvm.git .nvmcd ~/.nvmgit checkout v0.38.0. ./nvm.shcd ~/2、配置全局环境nano .bash_profile (写入上面代码)************export NVM_DIR="$HOME/.nvm"[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion************【备注】:如果下面配置不胜利,尝试:新建文件:~/.profile 或者 ~/.zshrc ,操作一样。 3、更新零碎环境变量下面配置好的环境变量,通过上面命令更新: source ~/.bash_profile4、nvm常用命令nvm ls-remote 列出所有可装置的版本nvm install <version> 装置指定的版本,如 nvm install v8.14.0nvm uninstall <version> 卸载指定的版本nvm ls 列出所有曾经装置的版本nvm use <version> 切换应用指定的版本nvm current 显示以后应用的版本nvm alias default <version> 设置默认 node 版本nvm deactivate 解除以后版本绑定nvm 默认是不能删除被设定为 default 版本的 node,特地是只装置了一个 node 的时候,这个时候咱们须要先解除以后版本绑定,而后再应用 nvm uninstall <version> 删除三、装置 Node.js# 1、装置node.jsnvm install 14.17.5# 2、查看node.js版本node -v # 3、切换node.js版本nvm ls (查看所有曾经装置的node.js版本)nvm use <版本号> (抉择从下面列出的node.js版本号)四、443谬误1、起因阐明通过命令脚本装置,会因为某些链接无法访问,产生443谬误: ...

November 26, 2021 · 1 min · jiezi

关于node.js:Nodejs的模块有哪些全局变量

一、模块的作用把实现某个性能的函数,放到独自 js 文件中,这个 js 文件就被称模块(module),其余代码只需导入这个 js 文件,即可应用其性能,达到代码复用的目标。当然除了函数,还能够把变量、class放到模块中,实现代码复用。 二、全局变量模块被 Node.js 加载时,会用函数将其进行包裹,所以就有了5个模块内全局变量: // Node.js 包裹模块的函数如下:(function(exports, require, module, __filename, __dirname) { // 理论模块代码,在这里});exports : 将本模块接口进行导出。另一种表达方式是 module.exports 。require : 蕴含本模块导入其余模块的信息。require.main 等同于 module 。module :指向以后模块的援用,蕴含以后模块的门路、目录等信息。__filename :示意以后模块文件的门路(蕴含模块文件名的全门路)__dirname :示意以后模块所在文件夹的门路三、通过实例查看各变量创立 example.js 文件,复制如下代码到文件中保留,在终端中执行 node example.js 就能够看到输入后果。 // example.jsconst path = require('path');const { PI } = Math;console.log("\r\n\r\n************************");// 导出接口(module.exports 等同于 exports)exports.area = (r) => PI * r ** 2;module.exports.area1 = (r) => PI * r ** 2;// 查看本模块导出那些接口console.log("exports : ", exports, "\r\n\r\n************************");// 查看本模块导入模块的信息console.log("require : ", require, "\r\n\r\n************************");// 查看 module 对象到底蕴含什么?console.log("module : ", module);console.log("module.exports : ", module.exports, "\r\n\r\n************************");// 查看本模块的残缺文件名console.log("__filename : ", __filename, "\r\n\r\n************************");// 查看本模块的目录console.log("__dirname : ", __dirname, "\r\n\r\n************************");// 通过path模块提供的办法,来查看本模块的残缺文件名console.log("path.dirname(__filename) : ", path.dirname(__filename));四、参考文档Node.js的模块,有哪些全局变量?

November 26, 2021 · 1 min · jiezi

关于node.js:npm与yarn区别

一、npm是啥npm(全称 Node Package Manager)是一个软件包管理系统,专门治理用 JavaScript 编写的软件包。能够收费下载他人写好的 js软件包,并用到我的项目中,当然也能够上传共享本人写的 js软件包。装置及应用,看这里! 二、yarn 是啥?yarn 也是一个软件包管理系统,同样用于治理 用 JavaScript 编写的软件包,yarn 的呈现是为了补救 npm 的一些缺点。譬如: 1、npm 的问题举例npm install 下载巨慢,特地是新我的项目,要等半天;删除node_modules,从新install,也一样很慢。同一个我的项目,装置无奈放弃一致性:^5.0.3 示意装置 5.X.X 版本,不同工夫部署我的项目,会 install 不同版本的软件包,给我的项目带来莫名其妙的问题。2、yarn 优化采纳了,并行、离线等性能,优化了 install 时下载速度;用了 yarn.lock 保障了软件包的版本一致性;执行命令也比拟简洁,如下: npm install === yarn npm install taco--save === yarn add taconpm uninstall taco--save === yarn remove taconpm install taco--save - dev === yarn add taco--devnpm update--save === yarn upgrade3、装置 yarnyarn 也是一个 JavaScript 软件包,须要先应用 npm 进行装置: npm install -g yarn三、参考文档npm与yarn区别?

November 26, 2021 · 1 min · jiezi

关于node.js:npm的安装与使用

一、npm 是啥?npm(全称 Node Package Manager)是一个软件包管理系统,专门治理用 JavaScript 编写的软件包。能够收费下载他人写好的 js软件包,并用到我的项目中,当然也能够上传共享本人写的 js软件包。Node.js 内置了npm,只有装置了node.js,就能够间接应用 npm,Node.js的装置形式,看这里!装置完 node.js 后,把npm更新到最新版本: npm install npm@latest -g二、我的项目中应用 npm1、初始化依据提醒填写对应信息,即可产生package.json 文件 cd <我的项目根目录>npm init 2、应用 npm 下载安装包# 装置须要应用的包npm install lodash# 装置实现后,package.json 中会增加版本信息,如下:{ "dependencies": { "lodash": "^1.0.0" }}3、应用装置的包var lodash = require('lodash');var output = lodash.without([1, 2, 3], 1);console.log(output);4、更新包# 法一:依据版本号更新npm install lodash@版本号# 法二:更新最新版本npm install lodashnpm install lodash@latest# 法三:批改 package.json 中包的版本号,下一次npm install会自动更新会批改后的版本。三、常用命令1、常用命令用 lodash 包阐明npm的应用办法: # 全局装置 lodashnpm install -g lodash# 本地装置 lodash(默认装置最新版本)npm install lodashnpm install lodash@latest# 装置指定版本npm install lodash@1.0.0# 卸载npm uninstall lodash # 查看已装置npm ls # 更新 lodash 到最新版本npm update lodash # 搜寻 lodashnpm search lodash 四、作用域1、无作用域的包var lodash = require('lodash');var output = lodash.without([1, 2, 3], 1);console.log(output);// package.json 中版本状况{ "dependencies": { "lodash": "^1.0.0" }}2、有作用域的包var projectName = require("@scope/package-name")// package.json 中版本状况{ "dependencies": { "@scope/package_name": "^1.0.0" }}五、常见谬误1、Error: Cannot find module当呈现如下谬误提醒,示意 packages 没有被装置: ...

November 26, 2021 · 1 min · jiezi

关于node.js:Nodejs学习总结事件循环

1.介绍事件循环机制是Node.js最重要的一部分之一。为什么他这么重要呢?因为它解释了为什么Node.js(单线程)能够是异步的,并且不会阻塞IO。Node.js能够做到这些,离不开调用栈、音讯队列和ES6工作队列。 2.调用栈在执行javascript脚本的时候会程序执行,讲执行的函数依照程序入栈,执行完之后退出栈。例子如下: test1() { console.log('test1');}test2() { console.log('test2');}test3() { console.log('test3 start'); test1(); test2(); console.log('test3 end');}test3();执行这个脚本会失去如下后果: test3 starttest1test2test3 end调用栈依照一下顺序调用:1.调用test3() |__test3__|2.执行test3() |__console.log("test3 start")__||__________test3___________ |3.test1()入栈并执行 |__console.log("test1")__||______test1___________||______test3___________|test1执行完之后退栈 4.test2()入栈并执行 |__console.log("test2")__||______test2___________||______test3___________|test2执行完之后退栈 5.继续执行test3 |__console.log("test3 end")__||__________test3___________|test3执行完之后退栈 3.音讯队列如果只应用一个调用栈,那么当一个函数执行工夫很长时,这个函数会阻塞前面的须要被调用的函数。因而,将那些会阻塞其余失常函数执行的函数(用户发动的事件)放在音讯队列中,如定时器、单击或键盘事件、Dom事件。 例子: test1() { console.log('test1');}test2() { console.log('test2');}test3() { setTimeOut(()=> console.log('last'),0); test1(); test2(); console.log('test3 end');}test3();执行这个脚本会失去如下后果: test1test2test3 endlast执行过程如下:1.执行test3()并入栈 |__test3__|2.执行setTimeOut并入队列 栈:|__setTimeOut(xxx)__||_____test3_________|队列:| console.log('last') |3.test1()入栈并执行 |__console.log("test1")__||______test1___________||______test3___________|test1执行完之后退栈 4.test2()入栈并执行 |__console.log("test2")__||______test2___________||______test3___________|test2执行完之后退栈 5.继续执行test3 |__console.log("test3 end")__||__________test3___________|test3执行完之后退栈 6.栈空之后执行音讯队列内容 队列:| console.log('last') |这个线程会先去执行调用栈,调用栈空之后心才会去执行音讯队列中的内容。 4.ES6工作队列ECMAScript 2015 / ES6 引进的工作队列的概念,这个工作队列会将promise放进去。音讯队列和工作队列之间的关系能够用在游乐园坐过山车来比喻:音讯队列把你放在队列的前面,在所有其他人的前面,你必须在那里期待轮到你,而工作队列是疾速通行证 这样您就能够在实现上一次骑行后立刻进行另一次骑行。 例子: test1() { console.log('test1');}test2() { console.log('test2');}test3() { setTimeOut(()=> console.log('last'),0); new Promise((resolve,reject)=>{ resole('before last'); }).then(res => console.log(res)); test1(); test2(); console.log('test3 end');}test3();执行这个脚本会失去如下后果: ...

November 25, 2021 · 1 min · jiezi

关于node.js:Nodejs学习总结packagejson

什么是package.json?package.json文件是一个我的项目一种展现形式。它是工具配置的地方存储库。 这也是 npm 和 yarn 存储所有已安装包的名称和版本的中央。 1.文件构造上面是package.json文件的一个例子: {}这是一个空对象。对于一个利用中的package.json文件来说,除了须要恪守JSON格局,没有任何固定的要求。然而如果你正在构建一个想要通过 npm 散发的 Node.js 包,事件的性质不太一样了,必须有一组属性来帮忙其他人应用它。 这是另外一个package.json文件: { "name": "test-project"}这个文件中,定义了name属性,这个属性能够定义app或者包的名称。 上面这个文件有更多的属性: { "name": "test-project", "version": "1.0.0", "description": "A Vue.js project", "main": "src/main.js", "private": "true", "scripts": { "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js", "start": "npm run dev", "unit": "jest --config test/unit/jest.conf.js --coverage", "test": "npm run unit", "lint": "eslint --ext .js,.vue src test/unit", "build": "node build/build.js" }, "depedencies": { "vue": "^2.5.2" }, "devDependencies": { "autoprefixer": "^7.1.2", "babel-core": "^6.22.1", "babel-eslint": "^8.2.1", "babel-helper-vue-jsx-merge-props": "^2.0.3", "babel-jest": "^21.0.2", "babel-loader": "^7.1.1", "babel-plugin-dynamic-import-node": "^1.2.0", "babel-plugin-syntax-jsx": "^6.18.0", "babel-plugin-transform-es2015-modules-commonjs": "^6.26.0", "babel-plugin-transform-runtime": "^6.22.0", "babel-plugin-transform-vue-jsx": "^3.5.0", "babel-preset-env": "^1.3.2", "babel-preset-stage-2": "^6.22.0", "chalk": "^2.0.1", "copy-webpack-plugin": "^4.0.1", "css-loader": "^0.28.0", "eslint": "^4.15.0", "eslint-config-airbnb-base": "^11.3.0", "eslint-friendly-formatter": "^3.0.0", "eslint-import-resolver-webpack": "^0.8.3", "eslint-loader": "^1.7.1", "eslint-plugin-import": "^2.7.0", "eslint-plugin-vue": "^4.0.0", "extract-text-webpack-plugin": "^3.0.0", "file-loader": "^1.1.4", "friendly-errors-webpack-plugin": "^1.6.1", "html-webpack-plugin": "^2.30.1", "jest": "^22.0.4", "jest-serializer-vue": "^0.3.0", "node-notifier": "^5.1.2", "optimize-css-assets-webpack-plugin": "^3.2.0", "ora": "^1.2.0", "portfinder": "^1.0.13", "postcss-import": "^11.0.0", "postcss-loader": "^2.0.8", "postcss-url": "^7.2.1", "rimraf": "^2.6.0", "semver": "^5.3.0", "shelljs": "^0.7.6", "uglifyjs-webpack-plugin": "^1.1.1", "url-loader": "^0.5.8", "vue-jest": "^1.0.2", "vue-loader": "^13.3.0", "vue-style-loader": "^3.0.1", "vue-template-compiler": "^2.5.2", "webpack": "^3.6.0", "webpack-bundle-analyzer": "^2.9.0", "webpack-dev-server": "^2.9.1", "webpack-merge": "^4.1.0" }, "engines": { "node": ">= 6.0.0", "npm": ">=3.0.0" }, "browserslist": ["> 1%", "last 2 versions","not ie<=8"]}version表明了以后的版本description是app/包 的简要形容main设置利用的入口处private如果被设置为true,将会阻止app/包 在npm上意外公布scripts定义了一系列开发人员能够运行的node脚本dependencies设置了一系列的须要被装置的包devDependencies设置了一系列的开发时须要被装置的包engines设置了以后包/app 应该运行的node.js的版本browserslist被用来通知这个我的项目你心愿反对的浏览器版本 ...

November 23, 2021 · 2 min · jiezi

关于node.js:require源码分析

1. 指标摸索 Node.js 的 require 办法是如何实现的 2. 调试办法2.1 点击增加配置 2.2 配置相干信息这里须要留神的是,把 skipFiles 须要把 <node_internals>/** 正文掉,这样才可能 debug Node 的源码。 { // Use IntelliSense to learn about possible attributes. // Hover to view descriptions of existing attributes. // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ { "name": "NodeStep", //独自调试js,即能够间接运行js "type": "node", "request": "launch", "program": "${file}", // "cwd": "${workspaceRoot}", "skipFiles": [ // "<node_internals>/**" ] } ]}3. require执行的过程是怎么的 在第八行打断点,之后就能够点击debug按钮了,咱们能够看到调用堆栈中,目前进行执行的函数。单步调试。 能够看到是调用了一个工具函数,最终调用了 mod.require 办法。持续单步调用。 ...

November 23, 2021 · 6 min · jiezi

关于node.js:Nodejs学习总结如何退出用Nodejs运行的程序

如何退出用Node.js运行的程序1.控制台退出在控制台运行的话,能够应用ctrl-C 退出。然而这一大节次要探讨的是编程式退出。 2.编程式退出Node.js 的外围模块process有一个办法能够编程式退出:process.exit() 当这个办法被调用的时候,无论是曾经发动的网络申请,文件系统调用,过程期待输入时处于期待状态,都能够被立即终止。 process.exit(1)退出码默认是0,代表着胜利。不同的退出码代表着不同的意思。 1 没有被捕捉到的致命异样。2 没有被应用(Bash 保留用于内置误用)。3 外部JavaScript解析谬误。这个谬误极少产生,个别产生在Node.js的开发过程中.4 外部JavaScript求值谬误。这个谬误也极少产生,个别产生在Node.js的开发过程中.5 致命谬误。这是V8中的致命的不可复原的谬误,相干信息会被打印到stderr中,并以FATAL ERROR结尾。6 非函数外部异样处理程序。存在未捕捉的异样,但外部致命异样处理函数不知何故设置为非函数,无奈调用。7 外部异样处理程序运行时失败。8 没有被应用。在老版本的Node.js,8也示意未被捕捉的异样。9 有效的参数。10 外部JavaScript脚本运行时失败。11 有效的调试参数。12 未实现的顶级期待。>128 信号退出。如果 Node.js 收到一个致命信号,例如 SIGKILL 或 SIGHUP,那么它的退出代码将是 128 加上信号代码的值。也能够通过设置process.exitCode属性。 process.exitCode = 1当程序运行完结的时候,Node.js将会返回设置的这个退出值。当所有解决实现后,程序将优雅地退出。很多时候咱们应用 Node.js 启动服务器,比方这个 HTTP 服务器: const express = require('expresss')const app = express()app.get('/',(req, res)=>{ res.send('Hi!')})app.listen(3000, ()=> console.log('Server is ready'));这个程序永远不会完结。 如果调用 process.exit(),任何以后挂起或正在运行的申请都将被停止。 在这种状况下,须要向命令发送一个 SIGTERM 信号,并应用过程信号处理程序进行解决: const express = require('express')const app = express()app.get('/', (req, res)=>{ res.send('Hi!')})const server = app.listen(3000,()=> console.log('Server is ready'))process.on('SIGTERM',()=>{ // close server server.close(()=>{ console.log('Process terminated') })})SIGTERM 是一种让过程优雅完结的信号。这种信号从过程管理者收回,比方新贵或主管等等。 ...

November 22, 2021 · 1 min · jiezi

关于node.js:Node学习总结Node-相关工具

二、Node 相干工具1、NVM: Node Version Manager切换node版本 1.1 Mac 装置 nvmhttps://github.com/nvm-sh/nvm... 2、NPM: Node Package Manager2.1 全局装置package$ npm install forever --global (-g)$ forever$ npm uninstall forever --global$ forever2.2 本地装置package$ cd ~/desktop$ mkdir gp-project$ cd gp-project$ npm install underscore$ npm list (ls)2.3 package.json初始化$ pwd$ npm init -y$ ls$ cat package.json2.4 应用package.json$ npm install underscore --save$ cat package.json$ npm install lodash --save-dev$ cat package.json$ rm -rf node_modules$ ls$ npm install$ npm uninstall underscore --save$ npm list | grep underscore$ cat package.json2.5 装置指定版本的包$ pwd$ npm list$ npm info underscore$ npm view underscore versions$ npm install underscore@1.8.0$ npm list$ npm uninstall underscore$ npm list2.6 更新本地装置的包$ npm info underscore$ npm view underscore versions$ npm install underscore@1.4.4 --save-dev$ npm list | grep gulp$ npm outdated //~2.0.0示意patch, ^2.0.0示意minor * 示意xx最新版本$ npm list | grep gulp$ npm update2.7 革除缓存npm cache clean --force ...

November 18, 2021 · 3 min · jiezi

关于node.js:通用nodejs开发架构

一、整体架构以nodejs我的项目为例(非前后端拆散),分层结构设计,分层说的就是将要做的事形象进去,分成互相分割的几局部,反馈在我的项目中就是文件构造。 上图将我的项目分为view、router、controller、cache、service、db几局部,其中:(以下均为同名文件夹) viewview 应用 ejs 模板,相当于 ssr 服务端渲染;蕴含一个组件文件夹、多个业务界面;注:除了失常业务的界面,通常会有个 error 和 404 界面;还会将公共组件放在 view/layout 下,供 ejs 援用;routerrouter 分为 view 和 api;view 路由负责加载 ejs,作为页面导航;api 路由理论就是接口,作数据渲染;蕴含一个路由文件夹、一个接口文件夹;controller次要是蕴含 router api 接口中波及到的业务逻辑;蕴含多个业务文件;service从 controller 过去的须要调用数据,拜访数据库的局部逻辑;蕴含多个业务文件;db包含数据库的配置,表的数据模型等内容;须要蕴含一个配置文件、一个执行同步的文件、一个表模型文件夹;cache个别采纳 redis 作为缓存库,包含 redis 的配置、get/set 定义和业务文件;须要蕴含一个配置文件、多个业务文件;二、技术选型重点说连贯数据库、缓存库局部: view、routerview 这里采纳 ejs 模板,如果是前后端拆散,前端采纳框架的话,这个 view 层就独自为前端 vue/react 我的项目了,同样的,router 也不须要 view 层的路由了。db连贯数据库,不同数据库有不同的 orm 可供操作:关系型数据库 mysql 能够应用 sequelize 来连贯数据库,还能够搭配 sequelize-auto 主动生成表模型 model非关系型数据库 mongodb 能够应用 mongoose 来连贯数据库三、标准这里标准包含团队合作、代码格调、编码习惯,业务等 git commit 次要typefeat:减少新性能fix:修复bug非凡type docs:只改变了文档相干的内容style:不影响代码含意的改变,例如去掉空格、扭转缩进、增删分号build:结构工具的或者内部依赖的改变,例如webpack,npm refactor:代码重构时应用revert:执行git revert打印的messagegit brach master:主分支,用于部署生产环境的分支,确保master分支稳定性,个别由develop以及hotfix分支合并,任何工夫都不能间接批改代码develop:开发分支,始终保持最新实现以及bug修复后的代码feature:开发新性能时,以develop为根底创立feature分支 release:预上线分支,公布提测阶段,会release分支代码为基准提测hotfix:修复分支,线上呈现紧急问题时,须要及时修复,以master分支为基线,创立hotfix分支,修复实现后,须要合并到master分支和develop分支当有一组 feature 开发实现,首先会合并到 develop 分支,进入提测时,会创立 release 分支。如果测试过程中若存在 bug 须要修复,则间接由开发者在 release 分支修复并提交。当测试实现之后,合并 release 分支到 master 和 develop 分支,此时 master 为最新代码,用作上线。 ...

November 18, 2021 · 1 min · jiezi

关于node.js:Node学习笔记-Nodejs

一、Node.js是什么Node.js is a JavaScript runtime built on Chrome's V8 JavaScript engine. 1. 个性Node.js 能够解析JS代码(没有浏览器安全级别的限度),提供很多零碎级别的API,如:· 文件的读写(File System)· 过程的治理(Process)· 网络通信(HTTP/HTTPS)· ...... 2. 举例2.1 浏览器安全级别的限度Ajax测试 <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title></head><body> <div> browser-safe-sandbox </div> <script> const xhr = new XMLHttpRequest(); xhr.open('get', 'https://m.maoyan.com/ajax/moreClassicList?sortId=1&showType=3&limit=10&offset=30&optimus_uuid=A5518FF0AFEC11EAAB158D7AB0D05BBBD74C9789D9F649898982E6542C7DD479&optimus_risk_level=71&optimus_code=10',false); xhr.send(); </script></body></html>浏览器预览 browser-sync start --server --files **/* --directory2.2 文件的读写(File System)const fs = require('fs);fs.readFile('./ajax.png','utf-8',(err,content)=>{ console.log(content);})2.3 过程的治理(Process)function main(arg) { console.log(arg);}main(process.argv.slice(2));2.4 网络通信(HTTP/HTTPS)const http = require('http');http.createServer((req,res)=>{ res.writeHead(200,{ 'contnt-type': 'text/plain' }); res.write('hello node.js'); res.end();}).listen(3000);

November 17, 2021 · 1 min · jiezi

关于node.js:关于-Nodejs-scoped-module-的一些理解

看这样一条命令: npm install @angular/router --save这个 @angular/router 代表什么含意? 咱们应用上面的命令,无奈搜寻到这个包: npm search @angular/router:No match found for "@angular/router"这是 NPM 的一个新个性,称为“作用域包”,它无效地容许 NPM 包被命名空间。 NPM 上的每个用户和组织都有本人的范畴,他们是惟一能够向其中增加包的人。 这很有用,起因有几个: 它容许组织明确哪些软件包是“官网的”,哪些不是。例如,如果一个包的范畴为 @angular,你就晓得它是由 Angular 外围团队公布的。包名只须要在它公布的范畴内是惟一的,而不是整个注册表。例如,主存储库中曾经采纳了包名称 http,但 Angular 也能够应用 @angular/http。范畴包没有呈现在公共搜寻中的起因是因为它们中的很多是由应用 NPM 付费服务的组织创立的公有包,并且他们不违心关上搜寻,直到他们齐全确定他们不是将不应该公开的任何内容公开 - 从法律角度来看,这是能够了解的。 npm 上基本上有两种类型的模块,它们是: (1) 全局模块 - 这些模块遵循当今存在的命名约定。 您须要('foo')并且非常高兴。 它们由一个或多集体通过 npm install XYZ 命令领有。 (2) 作用域模块 - 这些是在组织名称下“作用域”的新模块,该组织名称以 @ 组织名称、斜杠和包名结尾,例如 @someOrgScope/包名。 作用域是将相干包组合在一起的一种形式,也会影响 npm 解决包的形式。 作用域包是通过在 npm install 中通过名称援用它来装置的,后面是 @-symbol: npm install @myorg/mypackage作用域是将相干包组合在一起的一种形式,也会影响 npm 解决包的形式。 每个 npm 用户/组织都有本人的范畴,只有您能够在您的范畴内增加包。 这意味着您不用放心有人在您之前拿走您的包裹名称。 因而,这也是向组织收回官网软件包信号的好办法。SAP Spartacus 也应用了大量的 scoped module,如下图所示: ...

November 17, 2021 · 1 min · jiezi

关于node.js:你不知道的-Nodejs-Util

从类型判断说起在 JavaScript 中,进行变量的类型校验是一个十分令人头疼的事,如果只是简略的应用 typeof 会到各种各样的问题。 举几个简略的: console.log(typeof null) // 'object'console.log(typeof new Array) // 'object'console.log(typeof new String) // 'object'起初,大家发现能够应用 Object.prototype.toString() 办法来进行变量类型的判断。 const getTypeString = obj => Object.prototype.toString.call(obj)getTypeString(null) // '[object Null]'getTypeString('string') //'[object String]'getTypeString(new String) //'[object String]'对 toString() 办法进行代理,能够失去一个类型字符串,咱们就能够在这个字符串下面搞事件。 const getTypeString = obj => { return Object.prototype.toString.call(obj)}const isType = type => { return obj => { return getTypeString(obj) === `[object ${type}]` }}const isArray = isType('Array') // 该办法个别通过 Array.isArray 代替const isNull = isType('Null')const isObject = isType('Object')const isRegExp = isType('RegExp')const isFunction = isType('Function')const isAsyncFunction = isType('AsyncFunction')isNull(null) // trueisObject({}) // trueisRegExp(/\w/) // trueisFunction(() => {}) // trueisAsyncFunction(async () => {}) // trueBut,在 Node.js 中,外部其实是有一组用来判断变量类型的 api 的。而且性能异样丰盛,除了根底类型的判断,还反对判断 Promise 对象、Date 对象、各种ArrayBuffer。 ...

November 16, 2021 · 3 min · jiezi

关于node.js:JSRE中的多任务与多线程

前言 这几天在爱智官网看了下JSRE其余的Api,看了一个比拟有意思的模块 - 多任务模块task,大抵看了下他们的接口阐明和案例,感觉和多线程差不多,而后就筹备去看下实现形式,找了很久没有找到源码(╬ ̄皿 ̄),问了他们那边工作人员才晓得目前源码还没有凋谢进去,那我也就只能 wait, wait ... 凌晨3点半的我又醒来持续敲代码了,可信度看人品!!! 在没有失去源码加持的我,只能轻装上阵,这配备感觉承受不住你们的第一轮笔伐 ... 心愿在座的各位能够做集体,啊不,是做个猿(媛)! 多任务介绍 鄙人通过沧海一粟之力,终于给大家带来了第一手资讯。据牢靠情报得悉(PS:其实也就从他们官网间接复制了一点官网介绍过去(≖≖)✧): JSRE中每一个创立的Task都是操作系统中的一个独立线程,操作系统能够依据调度策略独立调度,用来进步应用程序的并行性。Node.js等运行时平台尽管通过多线程异步代理并行化,但外围程序过程无奈并行化,程序员可控性太低(这点我比拟同意),没有可控策略。除此之外,多任务模块还提供了更好的利用代码解耦。利用模块拆散和开发,更容易构建更简单的大规模利用。 花了我3秒的工夫敲出了下面的一大片内容,感叹本人从三岁就开始敲键盘的致力没有徒劳!(﹏)。 咱们都晓得Node.js是单线程,但这仅仅指js执行主线程是单线程,其余异步IO和事件驱动相干的线程通过libuv来实现外部的线程池和线程调度,自身只负责一直的往返调度,并没有进行真正的I/O操作,从而实现异步非阻塞I/O。 【问题】:这边说JSRE中每个task都是一个独立的线程,难道JSRE自身就反对多线程的嘛?【答】:不必想了,我本人也不是很分明,在官网没有找到一个精确的答案,那咱们就接着持续实际出真知! 实例测试1、同步执行测试代码:// main.js...console.info('start');// 模仿3s耗时操作let t = 0;while (t < 3000) { console.warn('wait...'); sys.sleep(1000); t += 1000;}console.info('end');...运行后果:咱们在入口文件main.js中退出以上测试代码,咱们都晓得js代码运行阶段都是从上往下开始程序执行的,咱们在主线程中增加了一段3秒的阻塞代码,当然在理论我的项目中兴许一个服务启动时耗时更多。从VSCode输入窗口中咱们能够看到日志是程序打印的,在打印end之前期待了3秒,使得主程序阻塞了3秒,这时候给用户的体验就会很卡顿。阻塞的3秒对于前面主线程的代码执行并没有任何影响,理论我的项目中兴许是开启了一些应用程序的其余附加服务。 上面我再用多任务模块解决一下阻塞代码。 2、多任务执行测试代码:// main.js...console.info('start');// 开启子工作new Task('./task.js');console.info('end');...// task.jslet t = 0;while (t < 3000) { console.warn('wait...'); sys.sleep(1000); t += 1000;}运行后果:在下面测试代码代码中咱们将3秒的阻塞代码放在了新建的task.js文件中,在main.js中咱们通过Task模块实例化了一个多任务实例,参数为task.js的文件地址,这时候运行代码咱们能够看到end字段的打印并不受多任务实例中的阻塞代码影响,这样就不会对主线程运行造成不必要的阻塞。而在Node.js中能够通过异步I/O交给外部线程池、工作线程或者开启子过程进行解决。数据通信咱们都晓得线程之间是并行运行的,一个线程是无奈间接拜访其余线程外部数据的,依照官网的说法,每一个多任务就是一个线程,那多任务之间的数据应该也是各自保护,隔离开的。那么多任务之间如何能工进行数据通信呢?这边在爱智开发手册上看到有很多中形式去进行多任务间通信。其中有个比拟有特点的是一个叫SyncTable的共享映射数据库,该模块具体的作用个人感觉应该是js模块间通信(纯属集体意见,错了勿喷!)。 说岔了,言归正传!咱们看一下这边多任务的通信形式之一:信号槽通信(SigSlot)。 据官网介绍: SigSlot 是一个事件驱动的异步通信组件,反对多任务和多过程。如果您须要多过程反对,则必须启动 JSRE(全局信号槽)并-g在启动过程时应用选项启用以后过程 GSS 反对。在 EdgerOS 中,来自同一供应商的应用程序能够应用 GSS 性能互相订阅和公布音讯。 SigSlot是典型的订阅和公布通信机制。基于 SigSlot,能够轻松进行多任务解耦。每个工作都是独立设计的,大大降低了利用开发的难度。 上面间接来应用一下这个模块: 测试代码 ...

November 16, 2021 · 1 min · jiezi

关于node.js:Nodejs连接MangoDB之后查找数据返回undefined的问题解决方法

案例const { MongoClient } = require('mongodb')async function main(){ const url = "mongodb://localhost:27017" const client = new MongoClient(url); const dbName = 'my-react-admin' try { await client.connect(); console.log('Access to database!') const db = client.db(dbName); db.collection('users').find({}).toArray((err, data) => { // if (err) throw err console.log(data) }) } catch (e) { console.error(e); } finally { await client.close(); }}main().catch(console.error);这样写进去运行,输入的是 Access to database!undefined也就是说,其实连贯上了数据库然而没返回货色。而后加上一个throw err看看到底哪里出了问题再次运行,报错了 MongoExpiredSessionError: Cannot use a session that has ended发现是因为异步操作的问题导致在数据库断开连接之前并没有进行数据查问,也就是查数据那一步并没有进行异步操作,而在Array外面传入回调函数是没法返回Promise对象的,所以也没法增加await。删除回调函数之后,再增加await输入,即可解决这个问题。 const { MongoClient } = require('mongodb')const url = "mongodb://localhost:27017"const client = new MongoClient(url);async function main(){ const dbName = 'my-react-admin' try { await client.connect(); console.log('Connect to database!') const db = client.db(dbName); const result = await db.collection('users').find({}).toArray() console.log(result) } catch (e) { console.error(e); } finally { await client.close(); }}main().catch(console.error);

November 14, 2021 · 1 min · jiezi

关于node.js:后端校招面试突击课4年本科基础大复盘-助力进大厂MK

download:后端校招面试突击课,4年本科根底大复盘 助力进大厂动态方法:有static润饰的方法。 非动态方法:没有static润饰的方法。 方法调用:一动态方法调用 动态方法/属性 1)一个类:间接调用。 2)不同类/不同文件: a: 类名.属性名/方法名 b:实例化对象。 类名 对象名 = new类名(); 对象名. 属性/方法 二动态调用 非动态方法/属性都先实例化对象。 类名 对象名 = new类名(); 对象名. 属性名/方法名 一非动态调用动态方法 二非动态调用非动态方法 1)同一类中:间接调用 2)不同类中: a: 类名 . 方法(只能是动态属性)b:实例化对象 总结:可间接调用的三种情况 1.一个类中 动态调动态 。 一个类中 非动态调用 动态/非动态。动态 类名.动态属性/动态方法。复制代码public class Demo03{ int age;public static void main(String []args){ System.out.println(Demo04.name);//动态调用动态1 Demo04.eat(); Demo04 d = new Demo04();//动态调用动态2 System.out.println(d.name); d.eat(); Demo03 d1 = new Demo03();//动态调用非动态 d1.method(); System.out.println(d1.age);}public void method(){ System.out.println("first method");}}复制代码复制代码1 public class Demo04{2 static String name = "张三";3 4 public static void eat(){5 System.out.println("肉夹馍");6 }7 }复制代码复制代码 1 public class Demo05{ 2 static int age; 3 String name; 4 public static void main(String []args){ 5 6 Demo05 d1 = new Demo05();//动态调非动态 实例化 7 d1.method(); 8 } 9 10 public void method(){11 System.out.println(age); //非动态调动态 12 method1(); //非动态调动态 13 System.out.println(name);//非动态调非动态 14 method2(); //非动态调非动态 15 System.out.println("first method");16 }17 public static void method1(){18 System.out.println("second method");19 }20 public void method2(){21 System.out.println("third method");22 }23 }复制代码复制代码 1 public class Demo06{ 2 3 public static void main(String []args){ 4 5 Demo06 d1 = new Demo06(); //动态调非动态 实例化 6 d1.method(); 7 } 8 public void method(){ 9 System.out.println(Person.name); //非动态调动态10 Person.method1(); //非动态调动态11 Person p = new Person(); //非动态调非动态 实例化12 p.method2();13 System.out.println("first method");14 }15 }16 class Person{17 static String name;18 int age;19 public static void method1(){20 System.out.println("second method");21 }22 public void method2(){23 System.out.println("third method");24 }25 }复制代码复制代码 1 public class Demo09{ 2 //实参到形参是单向的,所以在传送过程中形参值发生改变不会影响实参 3 public static void main(String []args){ 4 int i =1; 5 String s = "ww"; 6 Demo09 d = new Demo09(); 7 d.method(i,s); 8 System.out.println(i); 9 System.out.println(s);10 }11 public void method(int i,String s){12 i = 100;13 s = "asd";14 }15 public void method116 }复制代码复制代码public class ChuanDiZhi{ ...

November 13, 2021 · 2 min · jiezi

关于node.js:工作笔记汇总

MySQL开发环境版本和生产环境版本不统一我这里呈现了一个版本不统一的问题,公司服务器强制要求应用mysql5.7.30版本,然而我mac上本地是mysql8.0的版本。解决方案:本地docker一个5.7.30的容器,映射到3316端口。1、 docker pull mysql:5.7.30 目前公司用的这个mysql版本2、 mkdir -p ~/mysql5.7.30/data 创立volume文件3、 docker run -p 3316:3306 --name xtmysql -v ~/mysql5.7.30/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=cgz*****6 -d mysql:5.7.30 开启容器4、 本地docker镜像我就不新建一个用户去领有所有数据库的拜访权限了,因为间接用root了。docker装置mysql1、 docker装置并设置减速镜像2、 docker pull mysql:5.7.30 目前公司用的这个mysql版本3、 mkdir -p ~/mysql/data 创立volume文件4、 docker run -p 3306:3306 --name xtmysql -v ~/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=xt****6 -d mysql:5.7.30 开启容器5、 docker exec -it [容器ID] /bin/bash 进入mysql容器6、 mysql -u root -p 输出明码进入mysql对话环境7、 GRANT ALL PRIVILEGES ON *.* TO 'marhoo'@'%' IDENTIFIED BY 'very_strong_password_xxxxx'; mysql对话中,执行这条命令。创立一个新的独立用户,领有所有数据库的拜访权限,且让该用户能够从任意近程主机登陆,能够应用通配符 %8、 FLUSH PRIVILEGES; 而后mysql对话中,执行这条命令刷新权限信息9、 测试一下user组mysql> use mysqlmysql> select host, user, plugin from user; ...

November 12, 2021 · 1 min · jiezi

关于node.js:2021前端校招直通车实现Offer零距离MK

2021前端校招直通车,实现Offer零距离MK一、什么是结构函数 java结构函数,也叫构造方法,是java中一种非凡的函数。函数名与雷同,无返回值。 作用:一般用来初始化成员属性和成员方法的,即new对象产生后,就调用了对象了属性和方法。 在现实生存中,很多事物一出现,就天生具备某些属性和行为。比如人一出世,就有年龄、身高、体重、就会哭;汽车一出产,就有色彩、有外观、可能运行等。这些,咱们就可能将这些天然的属性和行为定义在结构函数中,当new实例化对象时,也就具备这些属性和方法了,没必要再去从新定义了,从而放慢了编程效率。 结构函数是对象一建立就运行,给对象初始化,就包含属性,执行方法中的语句。 而一般函数是对象调用才执行,用".方法名“的形式,给对象增加功能。 一个对象建立,结构函数只运行一次。 而一般函数可能被该对象调用多次。 二、结构函数的个性 1、函数名与类名雷同 2、不必定义返回值类型。(不同于void类型返回值,void是没有具体返回值类型;结构函数是连类型都没有) 3、不可能写return语句。(返回值类型都没有,也就不需要return语句了) 注:一般函数不能调用结构函数,只有结构函数才能调用结构函数。 三、示例 1、无参结构函数中只定义了一个方法。new对象时,就调用与之对应的结构函数,执行这个方法。不必写“.方法名”。 复制代码package javastudy;public class ConfunDemo { public static void main(String[] args) { Confun c1=new Confun(); //输入Hello World。new对象一建立,就会调用对应的结构函数Confun(),并执行其中的println语句。}}class Confun{ Confun(){ //定义结构函数,输入Hello World System.out.println("Hellow World");}}复制代码输入:Hellow World 2、有参结构函数,在new对象时,将实参值传给private变量,相当于实现setter功能。 复制代码package javastudy;public class ConfunDemo3 { public static void main(String[] args){ Person z=new Person("zhangsan",3); //实例化对象时,new Person()里间接调用Person结构函数并转转实参,相当于setter功能 z.show();}}class Person{ private String name;private int age;public Person(String n,int m){ //有参数结构函数,实现给private成员变量传参数值的功能 name=n; age=m; }//getter //实例化对象时,实现了sett功能后,需要getter,获取实参值。public String getName(){ return name;}public int getAget(){ return age;}public void show(){ //获取private值后,并打印输出 System.out.println(name+"\n"+age);}}复制代码输入:zhangsan3 ...

November 12, 2021 · 2 min · jiezi

关于node.js:前端移动nodemodules到其他位置

[toc] 阐明当初前端开发都是工程化治理, npm、yarn等包管理工具会在源码目录下生产node_modules文件夹; node_modules文件夹很宏大, 文件数量很多, 有时候心愿挪动到其余地位, 这里提供一种办法; 原理创立node_modules、package.json和其余的配置文件(如postcss.config.js)的符号链接(symbolic link) 批处理脚本命名为mknm.bat放到path门路, 在前端源码根目录执行mknm @rem 作用:在传入的文件夹下创立一个node_modules的link@rem 用法: 参数: 一个文件夹的残缺门路, 如果疏忽应用当前目录;@rem 其余:@rem 2018/11/08 周四 15:32:59.03@echo off&SetLocal EnableDelayEdexpansionrem 传入一个文件夹门路if "%1" equ "" ( "%~0" "%cd%" goto :eof)echo 以后门路: %cd%echo;rem 1. 传入一个文件夹的门路; 2. 在baseDir创立同名的文件夹; 3. 创立linkset dirPath=%~1set dirName=%~nx1set baseDir=D:\_node_modulesif not defined dirPath ( echo 参数为空; 应该传入门路 pause&goto :eof)rem 创立文件夹; 最终的文件夹的门路是newDircall :creatDir "!dirName!"mklink /d "!dirPath!\node_modules" "!newDir!\node_modules"mklink "!newDir!\package.json" "!dirPath!\package.json"if exist "!dirPath!\postcss.config.js" ( mklink "!newDir!\postcss.config.js" "!dirPath!\postcss.config.js")set file="!newDir!\readme.txt"(echo mklink /d "!dirPath!\node_modules" "!newDir!\node_modules"echo mklink "!newDir!\package.json" "!dirPath!\package.json"echo mklink "!newDir!\postcss.config.js" "!dirPath!\postcss.config.js") >%file%echo 实现..........goto :eof:creatDirset "name=%~1":Aset newDir=!baseDir!\!name!if not exist "!newDir!" ( mkdir "!newDir!\node_modules" goto :eof) else ( set "name=!name!-1" goto :A):eof留神不保障100%无效, 可能install出错、运行出错, 能够尝试把其余文件(比方vue.config.js)也link一下; ...

November 12, 2021 · 1 min · jiezi

关于node.js:node如何在本地新建一个接口使用express

1.首先先要确认你的电脑上是否有失常装置node环境如何确认?关上控台台,输出node -v node -v呈现如下截图所示,代表曾经装置node环境 如果呈现未找到node指令,请自行移步百度,下载并装置一下node环境 2.新建一个文件夹,咱们先默认文件夹名称为express-demo接下来,在该文件夹下新增一个package.json文件文件内容如下 { "name": "test", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], "author": "", "license": "ISC", "dependencies": { "express": "^4.17.1" }}保留该文件之后,在文件夹根门路下关上控制台,输出npm i,并按下回车 npm i短暂期待依赖包装置完之后,你会发现我的项目目录下新增了一个node_modules文件夹,代表此时依赖曾经装置胜利 3.我的项目根门路下新建一个server.js文件,文件内容如下const express = require("express");const app = express();// 设置容许跨域拜访app.all("*", function (req, res, next) { res.header("Access-Control-Allow-Origin", "*"); res.header("Access-Control-Allow-Credentials", true); res.header( "Access-Control-Allow-Headers", "Content-Type,Content-Length, Authorization, Accept,X-Requested-With" ); res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS"); res.header("Content-Type", "application/json;charset=utf-8"); next();});const data = { code: 200, data: "hello world", msg: "申请胜利",};const testApi = "/api/test";app.get(testApi, (req, res) => { res.send(data);});//配置服务端口const baseUrl = "192.168.1.9"; // 本机IPconst port = 8088; // 端口号app.server = app.listen(port, baseUrl, () => { console.log(`${baseUrl}:${port}${testApi}`);});备注,上诉代码内所写的本机ip为作者的本机电脑ip,小伙伴们如果想查看本人电脑的ip,能够ctrl+ R 输出cmd 关上控制台,输出ipconfig后查看 ...

November 10, 2021 · 1 min · jiezi

关于node.js:前端Nodejs面试题

一、Node根底概念1.1 Node是什么Node.js 是一个开源与跨平台的 JavaScript 运行时环境。在浏览器外运行 V8 JavaScript 引擎(Google Chrome 的内核),利用事件驱动、非阻塞和异步输入输出模型等技术进步性能。咱们能够了解为:Node.js 就是一个服务器端的、非阻塞式I/O的、事件驱动的JavaScript运行环境。 了解Node,有几个根底的概念:非阻塞异步和事件驱动。 非阻塞异步: Nodejs采纳了非阻塞型I/O机制,在做I/O操作的时候不会造成任何的阻塞,当实现之后,以工夫的模式告诉执行操作。例如,在执行了拜访数据库的代码之后,将立刻转而执行其前面的代码,把数据库返回后果的解决代码放在回调函数中,从而进步了程序的执行效率。事件驱动: 事件驱动就是当进来一个新的申请的时,申请将会被压入一个事件队列中,而后通过一个循环来检测队列中的事件状态变动,如果检测到有状态变动的事件,那么就执行该事件对应的解决代码,个别都是回调函数。比方,读取一个文件,文件读取结束后,就会触发对应的状态,而后通过对应的回调函数来进行解决。 1.2 Node的利用场景及存在的毛病1.2.1 优缺点Node.js适宜用于I/O密集型利用,值的是利用在运行极限时,CPU占用率依然比拟低,大部分工夫是在做 I/O硬盘内存读写操作。毛病如下: 不适宜CPU密集型利用只反对单核CPU,不能充分利用CPU可靠性低,一旦代码某个环节解体,整个零碎都解体对于第三点,罕用的解决方案是,应用Nnigx反向代理,开多个过程绑定多个端口,或者开多个过程监听同一个端口。 1.2.1 利用场景在相熟了Nodejs的长处和弊病后,咱们能够看到它适宜以下的利用场景: 长于I/O,不长于计算。因为Nodejs是一个单线程,如果计算(同步)太多,则会阻塞这个线程。大量并发的I/O,应用程序外部并不需要进行非常复杂的解决。与 WeSocket 配合,开发长连贯的实时交互应用程序。具体的应用场景如下: 用户表单收集零碎、后盾管理系统、实时交互零碎、考试零碎、联网软件、高并发量的web应用程序。基于web、canvas等多人联网游戏。基于web的多人实时聊天客户端、聊天室、图文直播。单页面浏览器应用程序。操作数据库、为前端和挪动端提供基于json的API。二、Node全副对象在浏览器 JavaScript 中,window 是全局对象, 而 Nodejs 中的全局对象则是 global。 在NodeJS里,是不可能在最外层定义一个变量,因为所有的用户代码都是以后模块的,只在以后模块里可用,但能够通过exports对象的应用将其传递给模块内部。所以,在NodeJS中,用var申明的变量并不属于全局的变量,只在以后模块失效。像上述的global全局对象则在全局作用域中,任何全局变量、函数、对象都是该对象的一个属性值。 2.1 常见全局对象Node常见的全局对象有如下一些: Class:BufferprocessconsoleclearInterval、setIntervalclearTimeout、setTimeoutglobalClass:Buffer Class:Buffer能够用来解决二进制以及非Unicode编码的数据,在Buffer类实例化中存储了原始数据。Buffer相似于一个整数数组,在V8堆原始存储空间给它调配了内存,一旦创立了Buffer实例,则无奈扭转大小。 process process示意过程对象,提供无关以后过程的信息和管制。包含在执行node程序的过程中,如果须要传递参数,咱们想要获取这个参数须要在process内置对象中。比方,咱们有如下一个文件: process.argv.forEach((val, index) => { console.log(${index}: ${val});});复制代码当咱们须要启动一个过程时,能够应用上面的命令: node index.js 参数...复制代码console console次要用来打印stdout和stderr,最罕用的比方日志输入:console.log。清空控制台的命令为:console.clear。如果须要打印函数的调用栈,能够应用命令console.trace。 clearInterval、setInterval setInterval用于设置定时器,语法格局如下: setInterval(callback, delay[, ...args])复制代码clearInterval则用于革除定时器,callback每delay毫秒反复执行一次。 clearTimeout、setTimeout 和setInterval一样,setTimeout次要用于设置延时器,而clearTimeout则用于革除设置的延时器。 global global是一个全局命名空间对象,后面讲到的process、console、setTimeout等能够放到global中,例如: console.log(process === global.process) //输入true复制代码2.2 模块中的全局对象除了零碎提供的全局对象外,还有一些只是在模块中呈现,看起来像全局变量,如下所示: __dirname__filenameexportsmodulerequire__dirname __dirname次要用于获取以后文件所在的门路,不包含前面的文件名。比方,在/Users/mjr 中运行 node example.js,打印后果如下: ...

November 10, 2021 · 8 min · jiezi

关于node.js:dependencies-devDevpendencies

node我的项目下的开发生产依赖node我的项目下的package.json文件中的devDependencies和dependencies有什么区别?我做我的项目的时候,我应该把我下载的的依赖放在哪个当中。 网上的说法: 生产环境中用到的放在dependencies中开发环境中用到的放在devDependencies中这个说法是没错的,然而咱们有时候确会感觉迷糊,问题本源在于咱们要了解这个生产环境和开发环境指的是什么 举个列子,咱们用webpack来打包咱们的我的项目,对于webpack来说,是开发环境还是生产环境? 答案是生产环境,因为咱们是在用webpack这个插件 而后咱们再来问个问题,那对于webpack这个插件来说,什么时候对于它来说是开发环境呢,当然是它的团队在开发它(webpack)的时候 webpack的我的项目在开发的时候,它也会有它本人的dependencies和devDependencies,这两个类依赖在开发阶段都会进行下载应用,他们两者的区别在于咱们在去应用它的时候,咱们下载安装webpack的时候,咱们会装置webpack的同时会去装置webpack中dependencies的依赖,而不会装置webpack中devDependencies的依赖 咱们晓得这个之后,咱们能够总结出 如果我的项目只是咱们本人用的时候,且是本地打包的时候,依赖放在dependencies或者devDependencies都是能够的,像咱们平时开发的vue、react我的项目,在打包的时候,咱们就曾经把须要的依赖打进我的项目外面了,所以不存在运行的时候短少依赖这种状况,所以放哪都是能够的当咱们这个我的项目须要当成插件给他人用的时候,咱们就要辨别这两个依赖,因为,如果咱们把应该放在dependencies的依赖放在devDependencies中,就是导致用户装置的时候短少依赖,我的项目报错,如果反过来,用户就会下载了不须要的依赖,对用户来说不敌对。如果服务器打包,为了避免浪费服务器资源,同时为了标准,还是应该辨别搁置,不要放多余的包在生产依赖中,也不要少放。个别不波及代码运行和打包的包就不要放在生产依赖中。

November 9, 2021 · 1 min · jiezi

关于node.js:WSL中通过fsstat获取文件的birthtime不正确的原因

原由起初是在WSL中开发一个动态博客我的项目,想要偷个懒,想间接通过fs.stat()获取文件的创立工夫来生成文章的工夫线排序,包含更新工夫 不对劲当我更改了一个md文件的内容时,我发现工夫线发生变化了,我是通过(await fs.stat(filePath)).birthtimeMs获取文件创建工夫的,然而我发现这个值居然在我改变过文件后变动了,变成了我扭转文件的工夫戳,白丝不の七姐(bushi) 找起因各种让我一通找之后,发现是WSL下的文件系统的问题,具体能够查看github上他人19年的时候提的一个issue:stat.birthtime is incorrect under WSL · Issue #30860 · nodejs/node (github.com),起因就是没有实现这个货色,而后就默认返回你mtime了通过stat命令一查看,我惊呆了,文件的Birth居然是-,你没看错就是一个杠 Size: 2477 Blocks: 8 IO Block: 4096 regular fileDevice: 810h/2064d Inode: 148374 Links: 1Access: (0644/-rw-r--r--) Uid: ( 1000/ ldl) Gid: ( 1000/ ldl)Access: 2021-11-08 16:35:59.405414600 +0800Modify: 2021-10-28 09:36:18.918000000 +0800Change: 2021-10-28 09:36:18.913397200 +0800 Birth: -自己测试在win上的是失常的。 总结还是老老实实在win上开发吧,gym!

November 8, 2021 · 1 min · jiezi

关于node.js:nvm一个node版本管理工具-打开终端自动切换node版本教程

在日常的前端或node后盾开发中,应用的局部node依赖,可能不反对以后应用的node版本,这时候如果还想应用这个依赖欢快的开发,那只能切换node版本了。 然而,卸载和装置node的麻烦水平尽管还能承受,但想在其余我的项目,仍然应用高版本node的语法反对,要么应用webpack或gulp这种构建编译工具,要么就还是须要应用高版本node。 这时候,nvm呈现了。 nvm就是node版本管理器,应用它能够装置多个版本的node,而后能够通过一行命令,轻松切换以后应用的node版本。 也就是说,不必再卸载、装置了,想用哪个版本,就用nvm装置,安完一个指令切换就能够了! 上面基于mac零碎,进行一些步骤的解说。 装置nvm 官网教程 卸载全局装置的node包既然应用nvm‘托管’,那么本人之前装置的全局node包,就须要先卸载了,避免出问题。 npm、cnpm、yarn等都会被一并删掉,稍后须要从新安。上面的指令,能够查看曾经装置在全局的模块node功能模块,以便删除这些全局模块后再依照不同的 node 版本从新进行全局装置 npm ls -g --depth=0 上面,是卸载步骤 也能够用 type -a node 查看一下门路,不同机器和不通装置形式,地位可能不一样。删除全局 node_modules 目录,外面其实只有几个文件夹,是npm和应用npm全局装置的比方yarn、cnpm等 sudo rm -rf /usr/local/lib/node_modules删除 node,其实就是卸载node环境了 sudo rm /usr/local/bin/node删除全局 node 模块注册的软链,懂linux指令语法的,大略能够看懂,上面这行的命令,就是先进入到零碎的全局指令文件,筛选出其中依赖于 node_modules的所有指令(其实还是步骤1中的那几个指令),而后删除 cd /usr/local/bin && ls -l | grep "../lib/node_modules/" | awk '{print $9}'| xargs rm能够应用终端输node -v,如果提醒node: command not found,就阐明卸载实现了 装置 nvm装置nvm有多种形式,上面是两种形式,倡议在官网查看最新的装置语句(因为外网问题,很可能会装置失败,前面有其余装置形式): curl形式: curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bashwget形式: wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash下面两个语句,都会都会执行nvm的装置脚本,装置实现后,会有相似上面的打印: => Profile not found. Tried (as defined in $PROFILE), ~/.bashrc, ~/.bash_profile, ~/.zshrc, and ~/.profile.=> Create one of them and run this script again=> Create it (touch ) and run this script again OR=> Append the following lines to the correct file yourself:export NVM_DIR="$HOME/.nvm"[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm=> Close and reopen your terminal to start using nvm or run the following to use it now:export NVM_DIR="$HOME/.nvm"[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm意思是,咱们须要在~/.bashrc、~/.bash_profile、~/.zshrc、~/.profile这四个文件的任意一个,退出nvm的这行指令,保留敞开,而后重启终端,就能够应用nvm指令了。 ...

November 4, 2021 · 2 min · jiezi

关于node.js:SSR项目-event-loop-Latency-时间逐渐升高问题排查

背景最近在做ssr我的项目的监控报警,其中一个指标是 event loop latency(事件循环的提早),局部我的项目呈现了以上指标逐步变高的景象。以下是问题解决的过程。 监控的工具采纳的是 prometheus监控应用的是 prom-client 库event loop latency(事件循环的提早): nodejs 的主线程的阻塞时长,在http申请场景中,阻塞工夫越长用户的响应工夫越长问题排查:基于event loop latency 的个性,察看了用户的均匀响应时长没有发现变长的状况,认真看了prom-client 的代码发现event loop latency 这个指标是采集的采集时候的提早时长,因而猜想是因为指标数量过多,导致收集指标的时候事件提早变长,通过验证果然当指标数量多的时候的确会有这个问题,最终优化了指标数量,问题解决。

November 2, 2021 · 1 min · jiezi

关于node.js:NODE版本切换及仓库地址管理

版本治理node版本治理常见的有两种nvm和n。 NVMnvm并非包管理器,它是用于治理多个node版本的工具 在理论的开发中,可能会呈现多个我的项目别离应用的是不同的node版本,在这种场景下,治理不同的node版本就显得尤为重要 nvm就是用于切换版本的一个工具. 应用nvmnvm提供了CLI工具,用于治理node版本 在终端中输出nvm,以查看各种可用命令 查看本地node版本 nvm ls // 本地版本nvm ls-remote // 线上可下载版本 下载版本 nvm install xxx例如 nvm install 8.0.0 下载指定版本8.0.0 切换版本 nvm use xxx例如 nvm use 8.0 应用最新的8.0.x版本 删除版本 nvm uninstall <version> 卸载一个版本其余命令 nvm run 6.10.3 app.js 应用6.10.3运行app.jsnvm exec 4.8.3 node app.js 应用指向4.8.3的门路运行`node app.js` nvm alias default 8.1.0 在shell上设置默认版本,不设置则默认是已下载的最新版本nvm alias default node 始终默认为shell上的最新可用版本 应用技巧版本简写 xxx代表须要切换的版本号,实际操作中发现能够简写,比方v10.5.0能够简写为v10,甚至写为10.如果本地同时存在12.22.5和12.19.0,切换10,会默认切换到最高版本12.22.5。 全局包 nvm有一个弊病,当你装置一些全局的包(或者本地),假如这个包是兼容的并在那个node版本上通过测试.如果你扭转了node的版本,这些全局命令无奈转移到新版本上.所以要么重新安装他们。 然而nvm下载版本时提供了--reinstall-packages-from参数,来解决从新下载的问题. 应用全局安装包的最简略的办法之就是: 例如:nvm install 12.22.5 --reinstall-packages-from=10.0.0下载12.22.5版本时将10.0.0的全局模块从新下载原生命令文档命令形容nvm --helpShow this messagenvm --versionPrint out the installed version of nvmnvm install [-s] <version>Download and install a <version>, [-s] from source. Uses .nvmrc if available--reinstall-packages-from=<version>When installing, reinstall packages installed in <node/iojs/node version number>--ltsWhen installing, only select from LTS (long-term support) versions--lts=<LTS name>When installing, only select from versions for a specific LTS line--skip-default-packagesWhen installing, skip the default-packages file if it exists--latest-npmAfter installing, attempt to upgrade to the latest working npm on the given node version--no-progressDisable the progress bar on any downloadsnvm uninstall <version>Uninstall a versionnvm uninstall --ltsUninstall using automatic LTS (long-term support) alias lts/*, if available.nvm uninstall --lts=<LTS name>Uninstall using automatic alias for provided LTS line, if available.nvm use [--silent] <version>Modify PATH to use <version>. Uses .nvmrc if available--ltsUses automatic LTS (long-term support) alias lts/*, if available.--lts=<LTS name>Uses automatic alias for provided LTS line, if available.nvm exec [--silent] <version> [<command>]Run <command> on <version>. Uses .nvmrc if available--ltsUses automatic LTS (long-term support) alias lts/*, if available.--lts=<LTS name>Uses automatic alias for provided LTS line, if available.nvm run [--silent] <version> [<args>]Run node on <version> with <args> as arguments. Uses .nvmrc if available--ltsUses automatic LTS (long-term support) alias lts/*, if available.--lts=<LTS name>Uses automatic alias for provided LTS line, if available.nvm currentDisplay currently activated version of Nodenvm lsList installed versionsnvm ls <version>List versions matching a given <version>nvm ls-remoteList remote versions available for install--ltsWhen listing, only show LTS (long-term support) versionsnvm ls-remote <version>List remote versions available for install, matching a given <version>--ltsWhen listing, only show LTS (long-term support) versions--lts=<LTS name>When listing, only show versions for a specific LTS linenvm version <version>Resolve the given description to a single local versionnvm version-remote <version>Resolve the given description to a single remote version--ltsWhen listing, only select from LTS (long-term support) versions--lts=<LTS name>When listing, only select from versions for a specific LTS linenvm deactivateUndo effects of nvm on current shellnvm alias [<pattern>]Show all aliases beginning with <pattern>nvm alias <name> <version>Set an alias named <name> pointing to <version>nvm unalias <name>Deletes the alias named <name>nvm install-latest-npmAttempt to upgrade to the latest working npm on the current node versionnvm reinstall-packages <version>Reinstall global npm packages contained in <version> to current versionnvm unloadUnload nvm from shellnvm which [current / <version>]Display path to installed node version. Uses .nvmrc if availablenvm cache dirDisplay path to the cache directory for nvmnvm cache clearEmpty cache directory for nvmn模块还有一个node的版本管理工具很好用,n模块,他是一个npm包。 ...

November 1, 2021 · 3 min · jiezi

关于node.js:关于-Nodejs-应用里使用-winston-进行日志记录的最佳实践

Logging with Winston and Node.js 假如您有一个在生产环境中运行的应用程序,每天有数百万用户赚取数千美元。应用程序可能存在谬误的起因有多种,作为开发人员,您须要找出起因并修复它。没有人违心应用有问题的应用程序,修复谬误会破费工夫和金钱。 你怎么能解决这个问题?兴许通过回到代码并查看每一行代码是否按预期运行。这对于小型应用程序来说更容易,但即便如此,尝试触发与用户雷同类型的谬误也可能很艰难。设想一下,这在大型应用程序中会有多难。 假如有一个实例,应用程序收集一些用户的信息并将它们保留到数据库中。 如果应用程序失败,服务器将向最终用户返回零碎谬误。最好能捕捉这些实例并解决这些谬误。在这种状况下,您如何晓得用户 a 或用户 b 遇到了单个零碎谬误?这些谬误可能由代码中的谬误、损坏的文件、谬误的逻辑或数据类型不匹配触发。 如果你须要防止这种挫折,你就无奈防止日志记录。日志是程序员首先要查找的中央,用于跟踪谬误和事件流,尤其是来自服务器的事件。日志会告诉您当利用程序运行并与用户交互时会产生什么。日志记录的一个很好的用例是,例如,如果您的零碎中有一个谬误,并且您想理解导致其产生的步骤。 日志记录是将应用程序流动生成的信息记录到日志文件中的过程。保留在日志文件中的音讯称为日志。日志是记录在日志文件中的单个实例。 在 Node.js 中构建应用程序日志至关重要。在本地运行应用程序时,能够将其挂接到调试器上,十分棒,能够在运行应用程序时发现问题。在开发过程中,您通常会应用 console.log 来获取应用程序日志。 然而当一个应用程序投入生产并且用户开始与之交互时,你就不能再应用 console.log 了。如果呈现问题并且应用程序解体,则无奈应用控制台进行查看。如果你有一个简洁、洁净和高质量的日志中间件,比方 Winston,那会很有帮忙。 Winston 解决您的应用程序流动并将有用的信息生成到日志文件或数据库中。之后,您能够查看应用程序生成的所有流动。 本指南将在 Winston 的上下文中解释日志记录。 理解生产应用程序是否呈现问题的惟一办法是创立日志。 记录从新创立并为您保留该问题。 如果呈现问题或呈现问题,日志会告诉您。 理解零碎的行为形式。 日志记录将生成无关零碎如何与用户交互以及进出零碎的信息。 跟踪您的系统活动。 日志能够显示实例产生的工夫以及触发日志的起因。 通常,日志记录的临界值是: 谬误跟踪调试利用性能抉择 winston 的收益Winston 是最好的日志中间件之一,每周下载量约为 4,000,000 次。以下属性使 Winston 成为整体通用的日志记录中间件。 它应用简略且可配置。日志级别(优先级)。 Winston 提供日志记录级别。它们示意日志优先级;这使您可能从须要较少关注的日志中整顿出要害日志。例如:{谬误:0,正告:1,信息:2,具体:3,调试:4,傻:5}。在这种状况下,谬误日志的优先级高于具体日志。记录通道(传输)。一个好的记录器有不同的形式来抉择你的日志输入目的地。应用 Winston,您能够以不同形式发送和保留日志,例如文件、数据库、电子邮件和控制台。日志格局。 Winston 为您提供了多种日志格局。例如,在将日志保留到 Mongo 数据库时,日志格局须要为 JSON 格局。日志剖析。 Winston 可帮忙您剖析代码块并测量胜利执行代码所需的工夫。Winston transportersWinston 的个性之一是它反对各种传输,例如文件传输。 这会将生成的日志音讯保留到日志文件中。 该文件是在您的零碎中指定的。 如果应用程序创立了它的第一个日志实例,该文件将主动生成。 之后,任何日志都将保留到创立的文件中。 为此,记录器配置对象须要指向一个文件(文件传输器)。 只需将新 winston.transports.File 中的传输配置对象 .transports.Console() 替换为 .transports.File() 即可,如下所示。 ...

October 27, 2021 · 3 min · jiezi

关于node.js:Nodejs-CMS基于-NestJSNuxtJS-的完整开源项目

这是一款轻量级的基于 Node.js 的开源 CMS,采纳前后端拆散开发模式,集成了 API、后盾治理、WEB 展现三个残缺我的项目。开箱即是一套残缺的企业网站,适宜企业、集体间接应用或二次开发。 APIAPI 应用 Node.js 服务端框架 NestJS,实现了: 首页 banner 增删改查;首页举荐产品改查;对于咱们、分割咱们改查,网页题目(Title)和形容(Descriptiton)设置;产品分类增删改查,网页题目(Title)和形容(Descriptiton)设置,以及自定义路由;产品增删改查,产品自定义路由;图片上传;JWT 权限认证;Swagger 输入 API 文档。 WEBWEB 端应用 Vue.js 的框架 NuxtJS SSR渲染,采纳 Bootstrap-vue 实现响应式网页,实现了: SSR 服务端渲染,全站伪动态,减少搜索引擎收录机会,有利于 SEO;生成动态 HTML 全站点,不便布署且减少搜索引擎收录机会,有利于 SEO;响应式网页设计,可主动适配挪动、PC 端。 后盾治理后盾治理应用 Element UI + Vue.js 开发,实现了: 管理员登录 JWT 认证;管理员增删改查;首页 Banner 增删改查;首页产品举荐;产品分类管理,自定义路由;产品治理,自定义路由;对于咱们/分割咱们治理;图片上传性能;引入 自定义 CKeditor5 富文本编辑器,图片上传减少 JWT 认证,晋升系统安全。 我的项目源码GitHub:https://github.com/givebest/node-nest-vue-nuxt-cmsGitee:https://gitee.com/givebest/node-nest-vue-nuxt-cms转载请注明出处: https://blog.givebest.cn/nodejs/2021/10/22/node.js-cms-based-nest.js-nuxt.js-vue.js.html

October 22, 2021 · 1 min · jiezi

关于node.js:Node定时任务怎么做

原文你地址: Node定时工作 背景目前咱们遇到了这样一个需要,每个用户都能够自定义定时推送,定时工作的工夫配置由用户本人配置,随时批改,而不是传统的由服务器设定好工夫跑定时工作。 如果是已知定时工作循环周期,那么Linux Crontab 定时工作即可实现。在node中也曾经有绝对成熟的计划。上面将我本人理解到的Node定时工作计划计划做一个介绍。 egg框架提供的schduler定时工作egg是阿里旗下的Node企业级利用框架,它提供了一套机制给开发者优雅的编写定时工作,具体参考官网文档:https://eggjs.org/zh-cn/basic... ,这里不对具体用法做具体论述,只简略讲一下它的配置用法。 1.动态定时工作,即定时周期,解决逻辑写死。 2.动静配置定时工作,这种相对来说灵便一点,开发者能够通过配置文件管制定时工作周期。 3.通过代码手动触发定时工作,咱们能够依据一些逻辑判断是否触发定时工作。 从上述三点看,egg提供的定时工作不能满足咱们须要用户自行配置定时周期的需要,所以只能寻求其余计划,通过查问材料咱们发现了node-schedule的库也提供了定时工作的性能。 node-schedule在浏览了node-schudule的文档 https://www.npmjs.com/package... 之后,他的用法如下: const schedule = require('node-schedule');const job = schedule.scheduleJob('42 * * * *', function(){ console.log('The answer to life, the universe, and everything!');});是的,他反对自定义定时周期,能够满足咱们的需要,能够作为咱们的抉择,Nice! 持续浏览其余开发者的应用文章,发现有一个node-schedule的相干问题记录,简要说就是定时器在预约工夫执行了2次,具体问题见原文:https://cnodejs.org/topic/5b5... 。这是一个低概率的问题,咱们没有去做验证,因为咱们的需要,及时定时器执行两次,对咱们的后果并没有影响,所以这不是妨碍咱们应用它的阻碍,有趣味的同学能够去测测bug。 写在最初最初这里是对咱们本人我的项目定时定时工作解决方案的总结,不感兴趣的同学可略过。 咱们的后端就是用的egg框架,所以最初咱们的解决方案是在agent过程中加了node-schdule的定时器,用户的定时器都会同步的agent过程中执行,目前咱们的用户量不大,临时只想到了这种解决形式,后续起量后可能会分布式部署后盾,这会是一个问题,量大的话单过程跑也会是一个问题,并且egg自身不倡议在agent过程中做太多业务相干的货色。还有个比拟重要的是agent是辅助过程,一些work的公共工作切实agent中实现的,agent产生未捕捉的谬误不会退出重启,所以容错解决必须要做,而且要做好。 如果你有更好的计划,欢送 留言 通知咱们。

October 22, 2021 · 1 min · jiezi

关于node.js:Nodejs和Jest单元测试无法正常退出的问题

最近在编写Nodejs/Jest单元测试时呈现利用无奈失常退出,明明单元测试曾经执行结束,然而利用就是卡住,无奈失常退出,导致单元测试无奈间断执行。因为利用较为简单,很难以排查是什么起因导致的,通过剖析起因次要如下: 未解决async/Promise会导致该起因,解决办法是在jest中增加--detectOpenHandles参数,增加该参数后,在运行时jest会检测并给出提醒,依此解决就能够。还有一种状况是利用中存在未清理的setInterval也会导致此状况,这种状况比拟荫蔽。解决办法也很简略,能够本人编写一个setSafeInterval函数,替换一个利用中所有应用setInterval的中央,记录一下定时器句柄,在退出前清理一下就能够了。

October 22, 2021 · 1 min · jiezi

关于node.js:如何做好-NodeJS-框架选型

作为一个有肯定工作教训的工程师,工作中常常会遇到技术选型的问题。比方当咱们在工作中须要应用到 NodeJS 时,第一个要解决的问题就是如何抉择一个适合的框架。 不同的框架有不同的特点,如果咱们仅仅从框架提供的能力登程,往往会迷失在对不同框架能力的比照中。如果能有一个清单,照着这个清单来考查每个框架,最终选出最符合要求的框架,那就真是太棒了! 咱们明天就试图来探讨出一个查看清单,通过这个清单,咱们能够找出最适宜咱们的框架。 咱们的应用场景是什么?应用场景是最重要的思考因素。在抉择框架之前,先搞清楚咱们的诉求是什么。 上面是一些常见的须要思考的点: 咱们的利用是全栈利用还是只提供 API 服务? 如果只提供 API 服务的话,是 REST 接口还是 GraphQL 接口?是否须要服务端渲染? 如果咱们应用 React 或者 Vue 来开发页面的话,一些 NodeJS 框架自身提供了对这些 UI 框架的反对。是否须要实时响应? 如果咱们须要应用到 WebSockets,是抉择一个反对 WebSockets 的框架,还是找一个社区保护的第三方库来集成到框架中?是否反对 TypeScript? 咱们是否要用 TypeScript 来开发利用?有些框架是应用 TypeScript 开发的,有些框架只提供了类型申明,而有些框架只有社区第三方保护的类型申明。即便咱们不应用 TypeScript 开发,类型申明也能够通过编辑器提醒给咱们带来微小的帮忙。框架的格调有些框架除了解决 HTTP 申请和响应以外,还提供了相似于校验、日志、认证、数据库形象以及依赖注入等其余丰盛的性能。这些框架通常对开发者有一些额定的要求,比方要依照框架要求的模式来组织代码能力应用框架的一些能力。 有一些框架只提供解决 HTTP 申请和响应的根本能力。其余能力须要开发者自行实现或者从框架的生态中自行获取。应用这些框架的开发者自由度很高,能够自在组织代码模式。然而当须要一些其余性能时,开发者须要额定付出精力来筛选适合的社区实现。 还有一些框架采取了中庸的模式,即除了提供 HTTP 申请和响应的根本能力以外,还提供了稍许性能,比方日志和校验等。 抉择哪种格调的框架,能够从下面列出的应用场景登程,也能够从集体和团队的格调偏好登程。 文档丰盛的文档至关重要。没有人会想一边开发业务,一边通过浏览框架的代码来理解框架的能力。如果一个框架没有文档,咱们应该回绝应用。对于有文档的框架,咱们如何评估文档的品质呢? 能够从上面几点登程: 是否能够不便的查找? 比方文档的构造是否容易了解?是否提供搜寻性能?文档是否有意义? 文档很重要,有用的文档更重要。没有用的文档写的再多也没有意义。当写代码的时候,这些文档是否能派上用场? 浏览和了解如果做一件事是一回事,动手做一件事是另一回事。在咱们写代码的时候,文档是否能够间接明确的帮忙咱们?实用的样例说的再多不如写一个样例给我。浏览文档有时候会让咱们迷失方向,如同坠入一团雾中。如果有一些官网提供的实用样例的话,对了解框架以及解决理论问题的帮忙就很大。官网提供的样例通常也会是解决某一个具体问题的最佳实际。 通常,咱们能够在框架源代码的 examples 目录中找到样例,有些框架还会有一个专门的仓库来寄存各种各样的样例。 社区生态一个框架的社区生态十分重要。在抉择框架的时候,察看下框架是否有讨论组之类的货色。参加其中的人是否敌对、是否乐于帮忙别人等。 框架是否风行不能决定咱们是否抉择这个框架。然而咱们在抉择框架的时候,要理解是否有其余开发者也在应用。如果咱们抉择了一个被宽泛应用的框架,那么咱们通常能够找到其余开发者开发的类库(中间件或者插件等)。 一个仓库的 star 数量某种意义上可能代表框架的受欢迎水平。然而却不能精确的表白框架的应用状况,咱们能够从框架的下载量着手。尽管有一些框架被其余类库内置应用,导致下载量很高,然而肯定水平上能够阐明框架在市面上的应用水平。咱们能够在 npm trends 上看到框架的下载量变动。 我的项目的衰弱水平当咱们决定抉择一个框架的时候,咱们还须要确保这个框架在可见的将来工夫内仍然可能失去无效的保护。 咱们能够从上面几个方面来考查我的项目的衰弱水平: 版本公布频率 即便一个框架的性能曾经十分欠缺了,安全更新和问题修复仍然非常重要。因而在面对曾经暂停保护或者很长时间没有发版的我的项目的时候,须要慎重考虑。官网在 issue 的沉闷水平 如果一个我的项目的 issue 里官网成员的参加水平很低,可能在暗示这个我的项目曾经不再保护了。相同,如果一个我的项目的 issue 很少,有可能阐明社区对这个框架的应用水平很低。Pull request 一个衰弱的我的项目,通常都会有一些近期刚提交的 pull request。如果一个我的项目有很多很好的 pull request 没有合并,可能阐明这个我的项目曾经不再保护了。贡献者 如果一个框架的贡献者只有一两个人,阐明社区对这个框架的关注度不高。同时较少的贡献者,会给框架的长期保护带来不确定性。一个衰弱的框架,应该有很多贡献者参加进来。我的项目依赖 一个有着很多依赖的框架,可能受攻打的中央也很多。同时,太多的依赖也可能给开发调试带来很多问题。咱们能够通过 npmgraph 这个工具才查看一个我的项目的依赖状况。这里有一些评估一个我的项目衰弱度的工具能够应用: ...

October 15, 2021 · 1 min · jiezi

关于node.js:从零开始使用nodejsejs模板轻松搭建web网站

什么是ejs 类比handlebars.js、artTemplate、jade这些模板引擎等,ejs也是一个javascript模板引擎,这里就不比拟它与其余模板引擎的性能做比照了,ejs语法过于浮夸,如果你会写html和简略的JavaScript,或者你用jsx写过react,那么ejs对你来讲将轻而易举。只需简略的两步: 将%标签包裹的js语法写在html里将html后缀的文件后缀名替换成ejs它与nodejs联合开发web网站几乎天作之合,因为它是基于node生态的模板,只需简略的配置,即可运行在node我的项目中。ejs将模板与数据无效联合在一起,疾速高效的构建html页面。能够将每一个ejs当做一个html或者组件来应用,具体ejs的语法应用能够查看 ejs文档 实战第一步:应用koa来搭建一个server首先初始化我的项目,在终端顺次执行 npm initnpm install koa 新建app.js入口文件,代码如下: const koa = require('koa')const app = new koa()app.use(async(ctx, next) => { console.log(ctx.request.path) if (ctx.request.path === '/index') { // 首页 ctx.response.status = 200 ctx.response.body = 'index' } else if (ctx.request.path === '/hello') { // hello页 ctx.response.status = 200 ctx.response.body = 'hello world' } else { ctx.throw(404, 'Not found') // 404 } await next()})app.listen(3000, function() { console.log('koa利用启动!')})以上代码所示,依据参数ctx的获取所拜访的path门路,而后别离对不同的门路进行解决 终端运行 npm app.js启动koa服务看到如下成果: ...

October 13, 2021 · 1 min · jiezi

关于node.js:前端脚手架是如何工作的呢

随着前端工程化工具的衰亡,日常的开发中大家也很少会间接html,js,css一把梭哈去开发,都是应用前端框架配合对应的脚手架来初始化一个我的项目,比方vue的vue-cli,react的create-react-app等。咱们只须要全局装置一下这些脚手架,而后输出vue create name或者create-react-app name就能够很不便的去初始化一个对应的我的项目。那你有想过装置完脚手架后这些命令背地都做了哪些事吗? 以vue-cli为例,首先咱们先全局装置vue-cli: npm install -g @vue/cli 装置胜利后,通过vue -V查看版本,证实装置胜利,并且有了全局的vue命令。关上终端,输出which查看vue命令对应的可执行文件所在门路: $ which vue/usr/local/bin/vue查看bin目录下vue文件对应的信息: ls -l /usr/local/bin/ | grep vuelrwxr-xr-x 1 xxx admin 39 Sep 27 2018 vue ->../lib/node_modules/@vue/cli/bin/vue.js咱们发现这里的vue只是一个软连贯,实在的文件指向这里../lib/node_modules/@vue/cli/bin/vue.js。好的,剥茧抽丝,咱们持续去找这个可执行文件: ls /usr/local/lib/node_modules/@vue/cli/bin vue.jsBingo!就是它!也就是说咱们在全局执行的vue 命令就是在执行这个vue.js。可是你该问了,这明明是个js文件,怎么就能间接执行了呢?不急咱们关上这个文件看看: #!/usr/bin/env node// Check node version before requiring/doing anything else// The user may be on a very old node versionconst chalk = require('chalk')const semver = require('semver')......神秘就在第一行:#!/usr/bin/env node,有趣味的能够看看什么是Sha-Bang。简略的说这句话就是指定这个vue.js脚本的执行应用node作为解释器。也就是说加了这一句话,你能够间接通过./vue.js的形式间接执行这个js脚本,成果跟node vue.js是一样的。 可是仔细的你还有一个问题,为什么我装置的是@vue/cli,然而注册的命令却是vue呢?其实这个咱们来看一下@vue/cli的package.json就晓得了: { "name": "@vue/cli", "version": "3.8.2", "description": "Command line interface for rapid Vue.js development", "bin": { "vue": "bin/vue.js" } ......}这外面通过bin指定了可执行文件的命令名以及可执行文件的门路,npm装置一个依赖时,如果该依赖的package.json中指定了bin的信息,那么同时会创立一个全局的软连贯指向该命令所对应的可执行文件。有趣味的能够看看npm的官网文档:package.json中bin的作用。 ...

October 10, 2021 · 1 min · jiezi

关于node.js:NPM-NODE-升级最新版

版本查看$ npm -vnpm WARN npm npm does not support Node.js v14.8.0npm WARN npm You should probably upgrade to a newer version of node as wenpm WARN npm can't make any promises that npm will work with this version.npm WARN npm You can find the latest version at https://nodejs.org/8.0.0$ node -vv14.8.0NPM 更新$ npm install -g npm/usr/local/bin/npx -> /usr/local/lib/node_modules/npm/bin/npx-cli.js/usr/local/bin/npm -> /usr/local/lib/node_modules/npm/bin/npm-cli.jsnpm WARN notsup Unsupported engine for npm@8.0.0: wanted: {"node":"^12.13.0 || ^14.15.0 || >=16"} (current: {"node":"14.8.0","npm":"6.14.7"})npm WARN notsup Not compatible with your version of node/npm: npm@8.0.0NODE 更新# 清理缓存$ npm cache clean -fnpm WARN npm npm does not support Node.js v14.8.0npm WARN npm You should probably upgrade to a newer version of node as wenpm WARN npm can't make any promises that npm will work with this version.npm WARN npm You can find the latest version at https://nodejs.org/npm WARN using --force Recommended protections disabled.# 装置n模块$ npm install -g nnpm WARN npm npm does not support Node.js v14.8.0npm WARN npm You should probably upgrade to a newer version of node as wenpm WARN npm can't make any promises that npm will work with this version.npm WARN npm You can find the latest version at https://nodejs.org/added 1 package, and audited 2 packages in 6sfound 0 vulnerabilities# 留神要加 sudo,否则会报权限问题$ sudo n stablePassword: installing : node-v14.18.0 mkdir : /usr/local/n/versions/node/14.18.0 fetch : https://nodejs.org/dist/v14.18.0/node-v14.18.0-darwin-x64.tar.xzDone

October 9, 2021 · 2 min · jiezi

关于node.js:文章小程序全栈开发从入门到上线第3节小程序登录

1.新增用户表新增一个名为bidu的数据库,并增加一张用户表users,其中id为主动递增。请留神字段的数据类型,不要选错了。 2.配置常量(1).env 在server根目录,新建一个文件server/.env,并配置jwt的密钥和过期工夫,数据库信息,以及微信小程序的相干信息。(注:.env文件不要同步git,外面放的都是一些敏感数据) # .env# jwt 密钥,任意字符串JWT_TOKEN_SECRET=ZM_j3@faF93Mdaie2f# jwt 生成的 token 的过期工夫,单位秒JWT_TOKEN_EXPIRATION_TIME=3600# 微信小程序 appidWECHAT_MINI_APP_ID=wx1f196182a0f906e7# 微信小程序 secretWECHAT_MINI_APP_SECRET=74d89************47c9f66aaeab# mysql 数据库配置MYSQL_HOST=localhostMYSQL_USER=rootMYSQL_PASSWORD=12345678MYSQL_DATABASE=biduMYSQL_PORT=3306MYSQL_CHARSET=utf8mb4_unicode_ci(2)constants.js 在后盾根目录里,新建一个server/constants/constants.js文件,用来寄存常量。增加微信小程序相干信息 /* constants.js */const WEAPP = { APP_ID: process.env.WECHAT_MINI_APP_ID, APP_SECRET: process.env.WECHAT_MINI_APP_SECRET}module.exports = { WEAPP}3.微信小程序登录1.创立server/utils/WXBizDataCrypt.js,用于微信解密 /* WXBizDataCrypt.js */var cryptoWx = require('crypto')function WXBizDataCrypt(appId, sessionKey) { // @ts-ignore this.appId = appId // @ts-ignore this.sessionKey = sessionKey}WXBizDataCrypt.prototype.decryptData = function (encryptedData, iv) { // base64 decode var sessionKey = Buffer.from(this.sessionKey, 'base64') encryptedData = Buffer.from(encryptedData, 'base64') iv = Buffer.from(iv, 'base64') try { // 解密 var decipher = cryptoWx.createDecipheriv('aes-128-cbc', sessionKey, iv) // 设置主动 padding 为 true,删除填充补位 decipher.setAutoPadding(true) var decoded = decipher.update(encryptedData, 'binary', 'utf8') decoded += decipher.final('utf8') decoded = JSON.parse(decoded) } catch (err) { throw new Error('Illegal Buffer') } if (decoded.watermark.appid !== this.appId) { throw new Error('Illegal Buffer') } return decoded}module.exports = WXBizDataCrypt2.创立server/utils/jwt.js,用于jwt验证和token生成 ...

October 7, 2021 · 4 min · jiezi

关于node.js:文章小程序全栈开发从入门到上线第2节新建小程序和后台

小程序1.新建关上微信开发工具,创立小程序我的项目,文件夹命名为mini,AppID、开发模式等,都进行如下抉择,如图: (AppID就是上一节,申请小程序的时候有的) 2.创立home页面在pages文件夹上面,新建一个文件夹home,而后,再在该文件夹上面新建 page,并在app.json外面,将其设置为首页(放在最后面),并更改题目为每日必读。如图: 后盾1.创立express我的项目新建一个server目录,平行于小程序的我的项目目录。而后,在server目录下关上命令窗。 # 初始化我的项目npx express-generator2.装置根底包# 装置数据库连接器> npm install access-db# 装置.env加载器> npm install dotenv# 装置jwt工具包,用于生成用户token和验证> npm install jsonwebtoken# 装置内部申请工具> npm install axios# 安装文件上传工具> npm install multer3.批改 app.js在server/app.js最后面引入require('dotenv').config(),这样能够注入.env文件外面的变量了。 /* app.js */require('dotenv').config()var createError = require('http-errors');var express = require('express');var path = require('path');var cookieParser = require('cookie-parser');var logger = require('morgan');...demo地址

October 7, 2021 · 1 min · jiezi

关于node.js:文章小程序全栈开发从入门到上线第1节准备

前言以前,咱们团队是用serverless进行我的项目开发,尽管serverless开发确实是少了很多步骤,但它的确也带来了一些问题。首先价格总体来讲,是要比纯服务器贵的,而且它的自由度、扩展性等不高。相当于是服务商做的中间层,也容易呈现各种中间层问题,再者,还是得你本人配置表,学习他们的查寻办法,而后写查寻什么的。呈现问题了,服务商的响应也慢。而且数据也都在他人的手里,感觉不够平安。起初还是决定本人写后盾。无论数据表,还是文件,都是在本人服务器的。通过几个月的应用状况来看,之前咱们的这个抉择是对的。 接下来,我就简略的讲讲这一整套是怎么做的,其实很简略的,等你认真看完这系列教程后,你会感觉后盾比前端还简略。为了更好的演示,我抉择用mongodb数据库作为文章内容的存储,mysql作为关系数据的存储,是的,我会同时用到两个数据库。 我只是为了不便演示,所以用的两种数据库。你齐全能够只采纳一种数据库适宜这是一套用Node.js进行后盾开发的微信小程序入门教程,适宜老手,也适宜想入门全栈的同学。我也只会讲到最根底的,最罕用的性能。 这套教程,次要是带大家走流程,小程序性能和界面都不会花太多工夫去做,有趣味的同学能够本人缓缓去拓展嘛 技术框架类型技术后盾express小程序微信原生开发数据库Mysql和MongoDB数据库连贯access-db服务器阿里云轻量服务器centos7文件减速阿里云cdn筹备工作1.申请一个小程序 在微信公众平台申请一个小程序,并在开发治理外面生成AppSecret,并记下。(用于微信受权登录) 2.装置开发工具 装置微信小程序开发工具,下载地址 3.装置Node.js 装置node.js,如果已装置,可疏忽。下载地址 #装置后,可输出命令进行验证> node -v> npm -v4.装置Mysql和Mongodb 装置Mysql和Mongodb数据库。此处,你也能够只抉择其中一种数据库,这不影响。 如果服务器上应用Mongodb数据库的话,倡议设置明码demo地址

October 7, 2021 · 1 min · jiezi

关于node.js:使用-Nodejs-Express-的最佳实践

Production best practices: performance and reliability 本文探讨部署到生产的 Express 应用程序的性能和可靠性最佳实际。 这个话题显然属于“devops”世界,涵盖传统的开发和经营。 因而,信息分为两局部: 在您的代码中要做的事件(开发局部)应用 gzip 压缩不要应用同步函数正确记录正确处理异样在您的环境/设置中要做的事件(操作局部)将 NODE_ENV 设置为“生产”确保您的利用主动重启在集群中运行您的应用程序缓存申请后果应用负载均衡器应用反向代理Use gzip compressionGzip 压缩能够大大减小响应主体的大小,从而进步 Web 应用程序的速度。 在您的 Express 应用程序中应用 compression 进行 gzip 压缩。 例如: var compression = require('compression')var express = require('express')var app = express()app.use(compression())对于生产中的高流量网站,施行压缩的最佳办法是在反向代理级别施行它。 在这种状况下,您不须要应用 compression 中间件。 无关在 Nginx 中启用 gzip 压缩的详细信息,请参阅 Nginx 文档中的模块 ngx_http_gzip_module。 Don’t use synchronous functions同步函数和办法会在它们返回之前阻塞正在执行的过程。 对同步函数的单个调用可能会在几微秒或几毫秒内返回,然而在高流量网站中,这些调用会累加并升高应用程序的性能。 防止在生产中应用它们。 只管 Node 和许多模块提供了它们性能的同步和异步版本,但在生产中始终应用异步版本。 惟一能够证实同步性能正当的工夫是在初始启动时。 如果您应用的是 Node.js 4.0+ 或 io.js 2.1.0+,您能够应用 --trace-sync-io 命令行标记在您的应用程序应用同步 API 时打印正告和堆栈跟踪。 当然,您不想在生产中应用它,而是要确保您的代码已筹备好用于生产。 ...

October 6, 2021 · 3 min · jiezi

关于node.js:nodejs-如何高效的操作数据库

简略中文access-db文档 对立各类数据库的连贯 目前反对的数据库有: 数据库 阐明 反对版本FastDB 本地json文件数据库[由access_db团队开发] 0.0.6MongoDB 分布式文件存储数据库 4.xMysql 关系型数据库 8.x, 5.xredis 高性能的 key-value 数据库 6.x, 5.x装置npm install access-dbyarn add access-db 在我的项目根目录新建.env文件,而后填写配置信息yarn add dotenv而后在我的项目最开始,尽可能早的引入require('dotenv').config().env配置如下 MYSQL_HOST MONGODB_HOST REDIS_HOST FASTDB_DIR 你应用什么数据库,则对应的地址就必填,不应用则不填 MYSQL_HOST=localhost // 非必填,不填则示意不应用该数据库 MYSQL_USER=root MYSQL_PASSWORD=123456 MYSQL_PORT=3306 MYSQL_DATABASE= # 默认UTF8_GENERAL_CI # MYSQL_CHARSET= # 最大连接数,默认10 # MYSQL_CONNECTION_LIMIT= MONGODB_HOST=localhost // 非必填,不填则示意不应用该数据库 MONGODB_USER= MONGODB_PASSWORD= MONGODB_DATABASE= MONGODB_PORT= REDIS_HOST=localhost // 非必填,不填则示意不应用该数据库 REDIS_PORT= FASTDB_DIR= // fastdb的数据存储目录,默认我的项目根目录下的fastdb目录 应用:import {mysql, mongodb} from 'access-db' async function exp() { let {data} = await mongodb.get('tableName1', id) await mysql.find('tableName2', { ...

October 2, 2021 · 1 min · jiezi

关于node.js:ECNP003-Policy

ECNP003 Policy Brief AssignmentSet by Danny CampbellFebruary 7, 2019You are involved in a community organisation and you want to advise the local authority what local services theyshould focus their efforts on. You have obtained a dataset that contains all house sales in the local area that occurredin the previous year. The dataset contains the house prices, as well as some house features, neighbourhood characteristicsand the environmental conditions where the house is located. The independent variables are:house_id house ID numberx_coord x coordinatey_coord y coordinatenum_beds the number of bedrooms in the housegarage indicator variable to denote if the house has a garage (1=Yes)house_type house type (1 = one-story; 2 = two-story; 3 = three-story)location where the house is located (1 = city centre; 2 = suburbs; 3 = countryside)local_crime indicator variable to denote if area has above national average crime rate (1 = high crime)local_schools indicator variable to denote if area has above national average schools (1 = good schools)local_health indicator variable to denote if area has above national average health care (1 = good health care)dist_recreationpark distance to closest outdoor recreation park (in KM)average_airqual average number of days of the year with poor air qualitywindturbine_visible indicator variable to denote if wind turbines are visible from the houseflood_risk flood risk classification (1 = low risk of flood; 2 = moderate risk; 3 = high risk)Each of you have a different dependent variable. You can work together, but note your model results will all be different.The dependent variable (house price in £) you should use is indicated following your name. It is essential thatyou use your specified dependent variable.The objective of this assignment is to establish the factors that influence house price. While the data is hypothetical itshould still give you estimation practice and, importantly, the opportunity to interpret the output. Imagining the datais real, your task is to: ...

September 30, 2021 · 4 min · jiezi

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

明天的知识点 (2021.09.30) —— 第898天 (我也要出题)[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]

September 30, 2021 · 1 min · jiezi

关于node.js:NodeJS创建多级目录-mkdir

环境: Ubuntu 16.04 上面两个计划都是采纳异部形式进行目录创立,同步形式同理。 形式一、import {promises as fs} from "fs";import * as path from 'path';/** * 读取门路信息 * @param {string} path 门路 */ async function getStat(dir) { try { const stat = await fs.stat(dir); return stat; } catch (error) { return false; }}/** * 创立门路 * @param {string} dir 门路 */function mkdir(dir) { return new Promise((resolve, reject) => { fs.mkdir(dir).then(function(){ console.log('Directory created successfully:', dir); resolve(true) }).catch(function(){ console.log('failed to create directory'); resolve(false) }) })}/** * 门路是否存在,不存在则创立 * @param {string} dir 门路 */ export async function mkdirRecursions(dir) { let isExists = await getStat(dir); //如果该门路且不是文件,返回true if (isExists && isExists.isDirectory()) { return true; } else if(isExists){ return false; } //如果该门路不存在,拿到下级门路 let tempDir = path.parse(dir).dir; //递归判断,如果下级目录也不存在,则会代码会在此处持续循环执行,直到目录存在 let status = await mkdirRecursions(tempDir); let mkdirStatus; if (status) { mkdirStatus = await mkdir(dir); } return mkdirStatus;}// example1//mkdirRecursions('./2019/1/2/3');形式二fs.mkdir('./2019/1/2/3', { recursive: true }).then(function(data){ console.log(data)}).catch(function(){})总结:形式二是 v10.0.0 版本当前呈现的,如果你版本>=v10.0.0,请应用官网的递归版本,否则应用形式一。 ...

September 28, 2021 · 1 min · jiezi

关于node.js:搞定-NodeJS-开发调试

代码调试有时候是一种充斥挑战的工作,如果有一个趁手的调试工具的话,往往能够做到事倍功半的成果。得益于这些年的疾速倒退,在 NodeJS 生态中曾经有了多种调试工具能够应用。咱们往年就来分享几个罕用的调试工具。 在 NodeJS 的代码调试中,通常又两大类调试办法,一种是打印日志,另一种是间接调试代码。咱们当初来别离阐明。 日志日志能够帮忙咱们记录在程序运行过程中的一些状态和错误信息。通过日志,咱们能够疾速的找到出问题的代码。比方借助于异样日志,咱们能够疾速的定位到具体的代码行。 debug 模块debug 是很多 NodeJS 包和框架应用的日志工具。这个包的长处是能够通过环境变量的模式细粒度的管制打印哪些日志。 比方在上面的代码中,假如咱们先发送了一些申请,而后又承受到了响应数据。 // index.jsconst debugHttpIncoming = require('debug')('http:incoming')const debugHttpOutgoing = require('debug')('http:outgoing')let outgoingRequest = { url: 'https://google.com'}// sending some requestdebugHttpOutgoing('sending request to %s', outgoingRequest.url)let incomingRequest = { body: '{"status": "ok"}'}// serving some requestdebugHttpOutgoing('got JSON body %s', incomingRequest.body)当咱们通过如下形式启动程序的时候: DEBUG=http:incoming,http:outgoing node index.js日志展现如下: 同时,debug 模块还反对 * 通配符,咱们能够通过 DEBUG=http:* node index.js 取得下面雷同的日志输入。 记录日志到文件通常,咱们须要将利用运行的日志做长久化解决,最简略的形式就是记录到文件。 pino 是一个高性能的日志模块,与 bunyan 相似,然而性能更好。 以下是几种日志模块的性能数据比照: benchWinston*10000: 2226.117msbenchBunyan*10000: 1355.229msbenchDebug*10000: 445.291msbenchLogLevel*10000: 322.181msbenchBole*10000: 291.727msbenchPino*10000: 269.109msbenchPinoExtreme*10000: 102.239mspino 应用非常简单: ...

September 26, 2021 · 2 min · jiezi

关于node.js:vuecliexpressserverless服务器上线部署教程

前端局部 vue-cli创立工程脚手架step1:新建文件夹 step2:在创立的文件夹中执行上面命令 npm install -g @vue/clivue create . ◆ 输出后会让你抉择,按提醒即可 ◆ 最初执行完结提醒如下即胜利 ◆ 会生成以下目录 step3:运行vue-cli-service serve调试 ◆ 执行上面命令 npm run serve ◆ 关上Local网址 step4:运行vue-cli-service build打包工程 ◆ 执行上面命令 npm run build ◆ 执行完结后会生成dist目录 前端局部到此结束... 后端局部 Express框架之express脚手架step1: 执行上面命令-装置生成器 npm install express-generator -g step2: 创立名称为APP的利用: express app 目录构造 step3: 将前端局部生成打包的dist文件夹的所有文件复制到public目录下 step4:本地调试-执行上面命令 npm run start ◆ 关上http://localhost:3000/ step5:创立自启动脚本,在根目录下创立scf_bootstrap文件 后盾局部实现... 腾讯云serverless平台部署step1:将后端局部的APP利用所有文件上传至任意一个git仓库 step2:登录腾讯云-关上serverless利用核心 ...

September 25, 2021 · 1 min · jiezi

关于node.js:搞不定-NodeJS-内存泄漏先从垃圾回收开始

通常来说,内存治理有两种形式,一种是手动治理,一种是主动治理。 手动治理须要开发者本人治理内存,什么时候申请内存空间,什么时候开释都须要小心解决,否则容易造成内存透露和指针乱飞的场面。C 语言开发是典型的须要手动治理内存的例子。 主动治理通常通过垃圾回收的机制来实现内存治理。NodeJS 中的内存治理是主动治理的。 垃圾回收垃圾回收器(garbage collector,GC)通过判断对象是否还在被其余对象援用来决定是否回收该对象的内存空间。 垃圾回收之前的内存在上面的图中,有一些对象还在被其余对象应用,而有一些对象曾经是齐全孤立状态,没有其余对象应用它了。这些曾经齐全孤立状态的对象是能够被垃圾回收器回收的。 垃圾回收之后的内存垃圾回收一旦开始运行,内存中的那些齐全孤立(不可达到)的对象会被删除,内存空间会被开释。 垃圾回收是如何工作的要搞清楚垃圾回收是如何工作的,须要先理解一些基本概念。 基本概念常驻集大小(resident set size):NodeJS 过程运行时占据的内存大小,通常蕴含:代码、栈和堆。栈(stack):蕴含原始类型数据和指向对象的援用数据。 栈中保留着局部变量和指向堆上对象的指针或定义利用程序控制流的指针(比方函数调用等)。 上面代码中,a 和 b 都保留在栈中。 function add (a, b) { return a + b}add(4, 5)堆(heap):寄存援用类型数据,比方对象、字符串、闭包等。 上面代码中,创立的 Car 对象会被保留在堆中。 function Car (opts) {this.name = opts.name}const LightningMcQueen = new Car({name: 'Lightning McQueen'})对象创立后,堆内存状态如下: 当初咱们增加更多的对象: const SallyCarrera = new Car({name: 'Sally Carrera'})const Mater = new Car({name: 'Mater'})堆内存状态如下: 如果当初执行垃圾回收,没有任何内存会被开释,因为每个对象都在被应用(可达到)。 当初咱们批改代码,如下: function Engine (power) {this.power = power}function Car (opts) {this.name = opts.namethis.engine = new Engine(opts.power)}let LightningMcQueen = new Car({name: 'Lightning McQueen', power: 900})let SallyCarrera = new Car({name: 'Sally Carrera', power: 500})let Mater = new Car({name: 'Mater', power: 100})堆内存状态变成: ...

September 24, 2021 · 1 min · jiezi

关于node.js:melog一个极为轻量的nodejsmysql博客程序

melog melog,一个基于jj.js(nodejs+mysql)构建的简略轻量级blog零碎。代码极简,无需编译,不便二次开发。 仓库地址:https://github.com/yafoo/melog 码云镜像:https://gitee.com/yafu/melog 官网地址:https://me.i-i.me/melog/ 演示demo:https://js.i-i.me/(后盾:admin,账号:melog@i-i.me,明码:123456) 装置git clone https://github.com/yafoo/melog.gitcd melognpm i运行1. 批改配置批改/config/app.js文件,敞开调试模式 app_debug: false,批改/config/db.js文件,配置数据库 type : 'mysql', // 数据库类型host : '127.0.0.1', // 服务器地址database : 'melog', // 数据库名user : 'root', // 数据库用户名password : '', // 数据库明码port : '3306', // 数据库连贯端口charset : 'utf8', // 数据库编码默认采纳utf8prefix : 'melog_' // 数据库表前缀2. 导入数据将根目录下melog.sql文件导入数据库。 3. 运行程序node server.js拜访首页http://127.0.0.1:3003拜访后盾后盾地址:http://127.0.0.1:3003/admin 默认账号:melog@i-i.me 默认明码:123456

September 23, 2021 · 1 min · jiezi

关于node.js:npm-install-错误-gyp-ERR-configure-error

问题:合并代码后始终无奈npm i 解决办法:尝试运行上面命令: sudo npm i --unsafe-perm如果无奈解决,顺次执行以下命令: sudo rm -rf ~/.node-gypsudo npm cache clean -fsudo npm install -g nsudo n stablesudo npm i --unsafe-perm胜利解决问题:

September 22, 2021 · 1 min · jiezi

关于node.js:一文搞懂如何使用Nodejs进行TCP网络通信

摘要: 网络是通信互联的根底,Node.js提供了net、http、dgram等模块,别离用来实现TCP、HTTP、UDP的通信,本文次要对应用Node.js的TCP通信部份进行实际记录。本文分享自华为云社区《一文搞懂如何应用Node.js进行TCP网络通信》,作者:lwq1228 。 1、构建TCP服务器1.1、应用Node.js创立TCP服务器为了应用Node.js创立TCP服务器,首先要调用require(‘net’)来加载net模块,而后调用net模块的createServer办法就能够轻松地创立一个TCP服务器,语法格局如下: net.createServer([options][, connectionListener])options是一个对象参数值,有两个布尔类型的属性allowHalfOpen和pauseOnConnect。这两个属性默认都是false;connectionListener是一个当客户端与服务端建设连贯时的回调函数,这个回调函数以socket端口对象作为参数。1.2、监听客户端的连贯应用TCP服务器的listen办法就能够开始监听客户端的连贯,语法格局如下: server.listen(port[, host][, backlog][, callback]);port:为须要监听的端口号,参数值为0的时候将随机调配一个端口号;host:服务器地址;backlog:连贯期待队列的最大长度;callback:回调函数。以下代码能够创立一个TCP服务器并监听8001端口: //引入net模块const net = require('net');//创立TCP服务器const server = net.createServer(function (socket) { console.log('有新的客户端接入');});//设置监听端口server.listen(8001, function () { console.log('服务正在监听中。。。')});运行这段代码,能够在控制台看到执行了listen办法的回调函数,如图所示: 能够应用相应的TCP客户端或者调试工具来连贯这个曾经创立好的TCP服务器。例如,要应用Windows的Telnet就能够用以下命令来连贯: telnet localhost 8001连贯胜利后能够看到控制台打印了“有新的客户端接入”字样,表明createServer办法的回调函数曾经执行,阐明曾经胜利连贯到这个创立好的TCP服务器。 server.listen()办法其实触发的是server下的listening事件,所以也能够手动监听listening事件,代码如下: //设置监听端口server.listen(8001);//设置监听时的回调函数server.on('listening', function () { console.log("服务正在监听中。。。")});除了listening事件外,TCP服务器还反对以下事件: connection:当有新的链接创立时触发,回调函数的参数为socket连贯对象。close:TCP服务器敞开的时候触发,回调函数没有参数。error:TCP服务器产生谬误的时候触发,回调函数的参数为error对象。下列代码通过net.Server类来创立一个TCP服务器,增加以上事件: //引入net模块const net = require('net');//实例化一个服务器对象const server = new net.Server();//监听connection事件server.on('connection', function (socket) { console.log('有新的客户端接入');});//设置监听端口server.listen(8001);//设置监听时的回调函数server.on('listening', function () { console.log('服务正在监听中。。。');});//设置敞开时的回调函数server.on('close', function () { console.log('服务已敞开');});//设置出错时的回调函数server.on('error', function (err) { console.log('服务运行异样', err);});1.3、查看服务器监听的地址当创立了一个TCP服务器后,能够通过server.address()办法来查看这个TCP服务器监听的地址,并返回一个JSON对象,因为这个办法返回的是TCP服务器监听的地址信息,所以应该在调用了server.listen()办法或者绑定了事件listening中的回调函数中调用该办法。这个对象的属性有: port:TCP服务器监听的端口号;family:阐明TCP服务器监听的地址是IPv6还是IPv4;address:TCP服务器监听的地址。代码如下: //引入net模块const net = require('net');//创立TCP服务器const server = net.createServer(function (socket) { console.log('有新的客户端接入');});//设置监听端口server.listen(8001);//设置监听时的回调函数server.on('listening', function () { //获取地址信息 let address = server.address(); //获取地址详细信息 console.log("服务器监听的端口是:" + address.port); console.log("服务器监听的地址是:" + address.address); console.log("服务器监听的地址类型是:" + address.family);});运行后果如图: ...

September 18, 2021 · 2 min · jiezi

关于node.js:node连接数据库

1.node端操作数据库其中mysql中的connect配置须要换成本人的 连贯数据库 var mysql = require('mysql') //调用MySQL模块 mysql模块要装置 $ npm install mysql //创立一个connection var connection = mysql.createConnection({ host: '', //主机 user: 'root', //MySQL认证用户名 password: 'password', //MySQL认证用户明码 port: '3306', //端口号 database: '' //数据库名}) //创立一个connectionconnection.connect(function (err) { if (err) { console.log('[query] - :' + err) return } console.log('[connection connect] succeed!')})/** 以下以info_user表为例 *///执行SQL语句---查问connection.query('SELECT * FROM info_user WHERE user_name = "project_admin_2"', function (err, results, fields) { if (err) { console.log('[SELECT] - :' + err) return } console.log('The solution is: ', results)}) //执行SQL语句---增加connection.query('INSERT INTO info_user(user_name, project_id, role_flag, graph_info) VALUES(?, ?, ?, ?)',['jiushugao', '1', '1','{}'], (err, results) => { if(err){ console.log('[INSERT] - :' + err) } console.log(results)}) //执行SQL语句---删除connection.query('DELETE FROM info_user WHERE user_name = "jiushugao"', (err, results) => { if(err){ console.log('[DELETE] - :' + err) } console.log(results)}) //执行SQL语句---更新connection.query('UPDATE info_user SET role_flag = "2" WHERE user_name = "jiushugao"', (err, results) => { if(err){ console.log('[UPDATE] - :' + err) } console.log(results)}) //敞开connectionconnection.end(function (err) { if (err) { return; } console.log('[connection end] succeed!') })能够将他们封装起来应用成果更佳,上面分三个文件 ...

September 15, 2021 · 2 min · jiezi

关于node.js:nvm-的安装与配置

nvm 的装置与配置下载返回 github 下载 nvm,举荐下载 nvm-setup.zip 解压 nvm-setup.zip 之后失去一个 exe 安装文件 装置装置过程中,首先抉择 nvm 的装置门路,尽量不要抉择有中文门路的地址 上面要抉择 node 的装置地址 如果不晓得 node 装置在哪里,在 cmd 输出 where node 即可查问where node 配置在 nvm 装置根门路找到 setting.txt 退出下载源的设置node_mirror: https://npm.taobao.org/mirrors/node/npm_mirror: https://npm.taobao.org/mirrors/npm/ 配置nvm的环境变量,计算机-属性-高级零碎设置-环境变量-零碎变量 查看是否装置胜利在 cmd 中输出 nvm 查问是否装置胜利,如果如下图显示,阐明装置胜利了nvm 如果没有呈现上图的状况,能够重启试一下nvm 的罕用指令查看本机装置的 node 所有的版本 nvm list 装置最新版本nvm install node装置指定版本nvm install v10.15.3应用指定版本nvm use v10.15.3卸载指定版本nvm uninstall v10.15.3可能遇到的问题及解决办法装置 nvm 之后,cmd 中输出 node -v 或者 npm -v 揭示不是外部命令或外部命令 查看 node 装置地址的 nodejs 是否可用,如果显示不可用,在 nvm 的地址下,新建一个空的 nodejs 文件夹,之后在环境变量的配置中,重新配置 nodejs 的地址配置完环境变量后,重启 cmd 终端,手动卸载现存的 node 版本之后再用 nvm 重新安装所须要的node版本包 ...

September 15, 2021 · 1 min · jiezi

关于node.js:Nodejs-较大文件流下载服务

通过Nodejs实现较大文件流下载性能 1. 应用TypeScript2. 应用swc做代码转译3. 应用ES6模块引入机制4. 应用管道流提供Excel下载服务次要代码 // 须要引入的模块有 import ExcelJS from 'exceljs'; import ExcelJS from 'exceljs'; @MRoute('/api/file') async getExcel(req: any, res: any) { const options = { stream: res, // 若这里不配置则须要应用workbook.stream.pipe(res); 写入到res流中 useStyles: true, useSharedStrings: true }; const workbook = new ExcelJS.stream.xlsx.WorkbookWriter(options); const worksheet = workbook.addWorksheet('数据流', { views: [{ state: 'frozen', xSplit: 1, ySplit: 3 }] }); let filename = "数据流表"; res.setHeader('Connection', 'keep-alive'); // 放弃链接始终在 res.setHeader('Content-Type', 'application/octet-stream'); // 文件类型为文件流模式 res.setHeader("Content-Disposition", "attachment; filename=" + encodeURIComponent(filename) + ".xlsx"); res.flushHeaders(); // 先将headers返回 // @ts-ignore // workbook.stream.pipe(res); // 应用管道流将xlsx流数据间接写入response流中 for (let index = 0; index < 1000000; index++) { const row = []; for (let i = 0; i < 20; i++) { row.push(i); } worksheet.addRow(row).commit(); // commit() 提交换数据 } workbook.commit(); // 提交整个Excel工作簿 }代码示例源码地址 ...

September 15, 2021 · 1 min · jiezi

关于node.js:如何编写一个自己的包然后发布包维护包

环境筹备装置node的环境学习npm包治理首先得要装置好Node.js环境,这个就自行搜寻查看相干教程装置,这里不具体开展细说了 更新npm工具版本Node.js自带npm,然而个别自带的npm版本会比最新版要低一下,能够手动更新npm的版本到最新 npm install npm@latest -gnpm账号注册咱们公布包到npmjs上,那么咱们就须要有一个本人的npm账号,大家能够通过npm官网自行注册,以便后续学习应用。 npm的根本应用一、体验初始化npm我的项目在筹备好环境后,咱们先来体验一下初始化npm我的项目的流程。 输出npm init命令后,依照提醒输出对应内容,这里咱们临时不须要输出任何内容,始终回车让其放弃为空就行。 在指定门路下应用terminal工具执行以下命令,创立一个新文件夹,并切换到该目录下 mkdir npmtestcd npmtest执行npm初始化命令,而后始终回车,会呈现以下输入 npm init/*This utility will walk you through creating a package.json file.It only covers the most common items, and tries to guess sensible defaults.See `npm help init` for definitive documentation on these fieldsand exactly what they do.Use `npm install <pkg>` afterwards to install a package andsave it as a dependency in the package.json file.Press ^C at any time to quit.package name: (npmtest)version: (1.0.0)description: git repository:keywords: author: license: (ISC)About to write to ***********\npmtest\package.json:{ "name": "npmtest", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], "author": "", "license": "ISC"}Is this OK? (yes) yes*/执行完初始化命令后,在我的项目目录文件中会呈现一个package.json文件,文件内容如下: ...

September 11, 2021 · 2 min · jiezi

关于node.js:如何正确地把服务器端返回的文件二进制流写入到本地保存成文件

我应用 Node.js 的 request 工具库,申请服务器端的视频文件,保留到本地之后,发现了问题。 我把 url 输出到浏览器里,手动下载视频文件后,文件大小为 70 多 KB: 然而应用 Node.js 代码申请文件数据并保留到本地,发现文件尺寸变成 100 多 KB 了,显然不正确: 通过钻研发现,须要应用 request 在发动数据申请之前,增加如下一行语句: request.defaults({ encoding: null });残缺的数据申请的代码: var requestC = request.defaults({ encoding: null }); console.log("get video via url: " + url ); const fileName = getVideoPartNameByUrl(url); requestC(getVideoOptions,function(error,response,body){ if(error){ console.log("error occurred: " + error); reject(error); } resolve({ fileName: fileName, fileContent: body }); }); 文件写入的代码: fs.writeFile(oVideo.fileName, oVideo.fileContent, "binary", function (error) { if(error) console.log("file writes error"); else{ console.log("File: ", oVideo.fileName, " writes ok"); } });之后问题隐没。 ...

September 11, 2021 · 1 min · jiezi

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

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

September 10, 2021 · 1 min · jiezi

关于node.js:express和koa的区别

express评论:繁琐简单!虽有精妙中间件设计,其余设计过于简单层层回调和递归koa2评论:精简彪悍!新js规范(async..await)很好实现中间件 1、express用法和koa用法简略展现如果你应用express.js启动一个简略的服务器,那么根本写法应该是这样: const express = require('express')const app = express()const router = express.Router()app.use(async (req, res, next) => { console.log('I am the first middleware') next() console.log('first middleware end calling')})app.use((req, res, next) => { console.log('I am the second middleware') next() console.log('second middleware end calling')})router.get('/api/test1', async(req, res, next) => { console.log('I am the router middleware => /api/test1') res.status(200).send('hello')})router.get('/api/testerror', (req, res, next) => { console.log('I am the router middleware => /api/testerror') throw new Error('I am error.')})app.use('/', router)app.use(async(err, req, res, next) => { if (err) { console.log('last middleware catch error', err) res.status(500).send('server Error') return } console.log('I am the last middleware') next() console.log('last middleware end calling')})app.listen(3000)console.log('server listening at port 3000')换算成等价的koa2,那么用法是这样的: ...

September 8, 2021 · 4 min · jiezi

关于node.js:npm安装时报错npm-ERR-Error-EPERM-operation-not-permitted

明天用npm 全局安装包时,不晓得为什么就报 npm ERR! Error: EPERM: operation not permitted, npm ERR! errno: -4048,npm ERR! code: 'EPERM',npm ERR! syscall: 'rename' 看意思是重命名权限不够我更改权限不行清理缓存: npm cache clean --force 也不行把nodejs 版本换了, 天然外面的npm 版本也换了, 还是不行又把所有的对于npm 的目录都设置成了管理员权限,也不行波及自定义的npm_global , npm_cache 目录 起初看到下面的 : npm update check failed ││ Try running with sudo or get access ││ to the local update config store via ││ sudo chown -R $USER:$(id -gn $USER) C:\Users\Administrator.config 故把npm 降级了下: npm install npm -g 从v6.14.5 降级到 v7.22.0竟然好了乖乖,竟然是npm 版本有问题了接着能够装cnpm @vue/cli , 再用@vue/cli 创立我的项目 vue create programName ...

September 7, 2021 · 1 min · jiezi

关于node.js:部署-Nodejs-应用以完成服务器端渲染-Server-Side-Rendering-的性能调优

原文:Operationalizing Node.js for Server Side Rendering 在 Airbnb,咱们花了数年工夫将所有前端代码稳固地迁徙到统一的架构中,在该架构中,整个网页都被编写为 React 组件的层次结构,其中蕴含来自咱们 API 的数据。 Ruby on Rails 在将 Web 连贯到浏览器方面所表演的角色每天都在缩小。事实上,很快咱们将过渡到一项新服务,该服务将齐全在 Node.js 中提供齐全造成的、服务器出现的网页。此服务将为所有 Airbnb 产品出现大部分 HTML。这个渲染引擎不同于咱们运行的大多数后端服务,因为它不是用 Ruby 或 Java 编写的。但它也不同于咱们的心智模型和通用工具所围绕的那种常见的 I/O 密集型 Node.js 服务。 当您想到 Node.js 时,您会构想您的高度异步应用程序同时高效地为数百或数千个连贯提供服务。您的服务正在从整个城镇提取数据,并进行利用轻量级解决,以使其适宜泛滥客户。兴许您正在解决一大堆长期存在的 WebSocket 连贯。您对非常适合该工作的轻量级并发模型感到称心和自信。 服务器端渲染 (SSR) 突破了导致该愿景的假如。它是计算密集型的。 Node.js 中的用户代码在单个线程中运行,因而对于计算操作(与 I/O 绝对),您能够并发执行它们,但不能并行执行。 Node.js 可能并行处理大量异步 I/O,但会遇到计算限度。随着申请的计算局部绝对于 I/O 的减少,并发申请将对提早产生越来越大的影响,因为 CPU 争用。 思考 Promise.all([fn1, fn2])。如果 fn1 或 fn2 是由 I/O 解析的承诺,您能够像这样实现并行性: 如果 fn1 和 fn2 是计算的,它们将改为这样执行: 一个操作必须期待另一个实现能力运行,因为只有一个执行线程。 对于服务器端渲染,当服务器过程解决多个并发申请时会呈现这种状况。 并发申请将被正在解决的其余申请提早: ...

September 6, 2021 · 1 min · jiezi

关于node.js:如何使用-Nodejs-访问-SAP-HANA-Cloud-数据库里的数据

登录 SAP Business Technology Platform,找到 space 下本人创立好的 HANA Cloud 实例,右键菜单抉择 Copy SQL Endpoint,将 HANA Cloud 实例的 endpoint 拷贝下来: 25eeba68-24ce-4b2d-aaa5-ee8d599ff4a0.hana.trial-eu10.hanacloud.ondemand.com:443 稍后咱们在 Node.js 代码里,会应用到。 新建一个 Node.js 利用,装置 hana client 开发库: npm install --save @sap/hana-client 残缺的源代码: var hana = require("@sap/hana-client");var connOptions = { serverNode: "25eeba68-24ce-4b2d-aaa5-ee8d599ff4a0.hana.trial-eu10.hanacloud.ondemand.com:443", encrypt: "true", sslValidateCertificate: "false", uid: "DBADMIN", pwd: "Sgd",};var dbConnection = hana.createConnection();dbConnection.connect(connOptions, function (err) { if (err) throw err; dbConnection.exec( `SELECT TOP 1000 "REGION", "DESCRIPTION"FROM "PLAIN"."REGIONS"`, function (err, result) { if (err) throw err; for( var i = 0; i < result.length; i++) console.log(result[i]); dbConnection.disconnect(); } );});执行后果: ...

September 2, 2021 · 1 min · jiezi

关于node.js:Nodejs-的单线程事件驱动模型和内置的线程池模型

原文:Why Node.js is a single threaded language ? 构建在 node.js 之上的应用程序应用单线程事件循环模型架构来解决多个并发客户端,如 JSP、Spring MVC、ASP.NET、HTML、Ajax、jQuery 等。存在其余能够应用的 web 技术,但这些列出的技术遵循“多线程申请-响应”架构来解决多个并发客户端。 单线程:Node JS 平台不遵循多线程申请/响应无状态模型。 它遵循单线程与事件循环模型。 Node JS Processing 模型次要受 JavaScript 基于事件的模型的启发,具备 JavaScript 回调机制。 因而,Node.js 能够轻松解决更多并发客户端申请。事件循环是 Node.js 解决模型的外围,如下图所示。 n = 客户端对 Node.js Web 服务器的申请数。假如他们同时拜访咱们构建在 Node.js 之上的 Web 应用程序客户端是 Client-1, Client-2 。 . . 客户端-n。m = 线程池中的线程数。 Web 服务器接管 Client-1, Client-2 。 . . 直到 Client-n 申请并将它们放入事件队列中。 单线程事件循环绝对于多线程申请/响应无状态模型的劣势: 能够轻松解决越来越多的并发客户端申请。因为事件循环,无需创立越来越多的线程。构建在 node.js 之上的应用程序应用尽可能少的线程来缩小内存或资源应用。 node.js 应用单线程事件循环模型架构的起因: 最后,node.js 是作为异步解决的试验而创立的,实践上,在应用程序不应用 CPU 时,在单个线程上进行异步解决能够在典型的 Web 负载下提供比典型的基于线程的实现更高的性能和可扩展性密集的货色,并且能够运行比 Apache 或 IIS 或其余基于线程的服务器多数千个并发连贯。node.js 的单线程、异步个性也的确使事件变得复杂,但在设计应用程序所破费的工夫、开发成本、死锁、优先级倒置以及所有应用程序的生命周期问题方面,线程比这更蹩脚。对于服务器的每个申请用一个线程来响应的模型还有一个家喻户晓且备受批评的问题,即与事件循环线程模型相比,它们在多种场景下的扩展性不佳,简而言之,它们不足作为应用程序的可扩展性一直增长以满足将来的需要并减少新性能。因为 Node.js 遵循单线程事件循环模型,其灵感来自 JavaScript 基于事件的模型和 JavaScript 回调机制。因而,node.js 是相似于 JavaScript 的单线程,但不是纯 JavaScript 代码,这意味着像网络调用、文件系统工作、DNS 查找等异步实现的事件实际上并不禁主线程解决。 ...

September 2, 2021 · 1 min · jiezi

关于node.js:node-fs

fs模块操作文件系统(文件/目录)在fs模块中,能够应用stat办法或lstat办法查看一个文件或目录信息。当查看符号链接文件的信息时,必须应用lstat办法。 一、异步办法 1.语法 fs.stat(path, callback); fs.lstat(path, callback); 2.参数 (1)path:用于指定须要被查看的文件或目录的残缺门路及文件名或目录名; (2)callback:用于指定查看文件或目录信息操作结束时执行的回调函数,办法如下: function(err, stats){ …… }。 (2-1)参数: err:查看文件或目录信息操作失败时触发的谬误对象; stats:一个fs.Stats对象。 (2-2)该对象具备如下一些办法: ☛ isFile:用于判断被查看的对象是否为一个文件,如果是返回true,否则,返回false; ☛ isDirectory:用于判断被查看的对象是否为一个目录,如果是的话则返回true,否则,返回false; ☛ isBlockDevice:用于判断被查看的文件是否为一个块设施文件,如果是的话则返回true,否则,返回false(仅在Unix操作系统下无效); ☛ isCharacterDevice:用于判断被查看的文件是否为一个字符设施文件,如果是的话则返回true,否则,返回false(仅在Unix操作系统下无效); ☛ isSymbolicLink:用于判断被查看的文件是否为一个符号链接文件,如果是的话则返回true,否则,返回false。该办法仅在lstat办法的回调函数中无效; ☛ isFIFO:用于判断被查看的文件是否为一个FIFO,如果是的话则返回true,否则,返回false(仅在Unix操作系统下无效); ☛ isSocket:用于判断被查看的文件是否为一个socket文件,如果是的话则返回true,否则,返回false(仅在Unix操作系统下无效); (2-3)该对象具备如下一些属性: ☛ dev:该属性值为文件或者目录所在设施ID,该属性值仅在Unix操作系统下无效; ☛ ino:该属性值为文件或者目录的索引编号,该属性值仅在Unix操作系统下无效; ☛ mode:该属性值为应用数值模式代表的文件或目录的权限标记; ☛ nlink:该属性值为文件或者目录的硬连贯数量; ☛ uid:该属性值为文件或者目录的所有者的用户ID,该属性值仅在Unix操作系统下无效; ☛ gid:该属性值为文件或目录的所有者的组ID,该属性值仅在Unix操作系统下无效; ☛ rdev:该属性值为字符设施文件或块设施文件所在设施ID,该属性值仅在Unix操作系统下无效; ☛ size:该属性值为文件尺寸(即文件中的字节数); ☛ atime:该属性值为文件的拜访工夫; ☛ mtime:该属性值为文件的批改工夫; ☛ ctime:该属性值为文件的创立工夫; 1234var fs = require('fs');fs.stat( './server.js',function(err, stats){ console.log(stats);});运行后果: 二、同步形式 在应用同步形式查看文件信息时,能够应用fs模块中的statSync办法或lstatSync办法。 1.语法 var mystat = fs.statSync(path); ...

September 1, 2021 · 1 min · jiezi

关于node.js:用Node轻松完成一个分布式事务TCC保姆级教程

什么是TCC,TCC是Try、Confirm、Cancel三个词语的缩写,最早是由 Pat Helland 于 2007 年发表的一篇名为《Life beyond Distributed Transactions:an Apostate’s Opinion》的论文提出。 TCC组成TCC分为3个阶段 Try 阶段:尝试执行,实现所有业务查看(一致性), 预留必须业务资源(准隔离性)Confirm 阶段:如果所有分支的Try都胜利了,则走到Confirm阶段。Confirm真正执行业务,不作任何业务查看,只应用 Try 阶段预留的业务资源Cancel 阶段:如果所有分支的Try有一个失败了,则走到Cancel阶段。Cancel开释 Try 阶段预留的业务资源。TCC分布式事务里,有3个角色,与经典的XA分布式事务一样: AP/应用程序,发动全局事务,定义全局事务蕴含哪些事务分支RM/资源管理器,负责分支事务各项资源的治理TM/事务管理器,负责协调全局事务的正确执行,包含Confirm,Cancel的执行,并解决网络异样如果咱们要进行一个相似于银行跨行转账的业务,转出(TransOut)和转入(TransIn)别离在不同的微服务里,一个胜利实现的TCC事务典型的时序图如下: TCC网络异样TCC在整个全局事务的过程中,可能产生各类网络异常情况,典型的是空回滚、幂等、悬挂,因为TCC的异常情况,和SAGA、可靠消息等事务模式有相近的中央,因而咱们把所有异样的解决方案通通放在这篇文章《分布式事务最经典的七种解决方案》的子事务屏障环节进行解说 TCC实际上面咱们进行一个TCC事务的具体开发 目前可用于TCC的开源框架,次要为Java语言,其中以seata为代表。咱们的例子采纳nodejs,应用的分布式事务框架为dtm,它对分布式事务的反对十分优雅。上面来具体解说TCC的组成 上面咱们来编写具体的Try/Confirm/Cancel的处理函数 router.post('/api/TransOutTry', (ctx, next) => { console.log("TransOutTry") ctx.body = { result: "SUCCESS" }}).post('/api/TransOutConfirm', (ctx, next) => { console.log("TransOutConfirm") ctx.body = { result: "SUCCESS" }}).post('/api/TransOutCancel', (ctx, next) => { console.log("TransOutCancel") ctx.body = { result: "SUCCESS" }}).post('/api/TransInTry', (ctx, next) => { console.log("TransInTry") ctx.body = { result: "SUCCESS" }}).post('/api/TransInConfirm', (ctx, next) => { console.log("TransInConfirm") ctx.body = { result: "SUCCESS" }}).post('/api/TransInCancel', (ctx, next) => { console.log("TransInCancel") ctx.body = { result: "SUCCESS" }})到此各个子事务的处理函数曾经OK了,而后是开启TCC事务,进行分支调用 ...

August 30, 2021 · 1 min · jiezi

关于node.js:如何通过cookiesession鉴权nodejskoa

http是一种无状态的协定,每一个申请都是独立的,即便同一个页面向服务器发送屡次申请,服务器也无奈辨别是不是同一用户,所以这个时候能够借助于cookie来做身份认证,当用户登录胜利,服务器为浏览器设置cookie,而在前面的申请当中,浏览器发送申请的时候,就会携带cookie,需注意的是,cookie须要同源的申请下才会发送。 设置cookie的时候还有以下值属性能够进行抉择,别离是过期工夫和作用域,没有设置过期工夫,cookie的生命周期仅为会话阶段,敞开浏览器即被删除,通过max-age或者expires设置,cookie的生命周期为有效期内,超出有效期则被删除,作用域可设置domain和path,domain代表指定哪些主机能够接管cookie,没有设置的时候默认origin,仅以后域名无效,设置后以后域名和子域名都可用,path用于指定主机下哪个门路能够承受cookie。 浏览器端通过 document.cookie 来获取和设置cookie,当须要在浏览器使cookie生效,则能够设置 max-age=0 document.cookie = 'name=alice;max-age=5' // max-age在浏览器端的单位为秒 在服务器端,通过nodejs中http模块设置响应头信息setCookie,第二次申请则会在申请头中携带cookie,如果对nodejs不太熟悉,能够参考这一篇文章, nodejs中如何应用http创立一个服务 const http = require('http')const server = http.createServer((req, res) => {  res.setHeader('Set-Cookie', ['age=16;max-age=20000']) // max-age在nodejs的单位为毫秒  res.end('cookie')}) koa中通过 ctx.cookies.set和ctx.cookies.get来别离设置和获取cookie,以下代码示意,当拜访 localhost:7000/login的时候,服务器为浏览器设置一个 cookie,当拜访 localhost:7000/user的时候,服务器获取浏览器的cookie。 如果对koa还不太熟悉,能够参考这一篇文章,让nodejs开启服务更简略--koa篇 const Koa = require('koa')const app = new Koa()const Router = require('koa-router')const router = new Router()router.get('/login', (ctx, next) => {  ctx.cookies.set('wheater', 'sunny', {    maxAge: 60*1000  })  ctx.body = 'set cookie'})router.get('/user', (ctx, next) => {  const cookie = ctx.cookies.get('wheater')  ctx.body = cookie})app.use(router.routes())app.use(router.allowedMethods())app.listen(7000, ()=>{console.log('开启服务')})应用nodejs中的http模块对申请进行响应须要本人解决简单逻辑,通过 koa 能够简化很多操作,比方koa就主动加上了 HttpOnly的属性 ...

August 29, 2021 · 1 min · jiezi

关于node.js:win10-opencv4nodejs-安装-踩坑实况

官网教程: https://www.npmjs.com/package... !!!以下操作均在powershell(管理员模式)中实现!!!1. 装置cmake(请自行装置并且实现环境配置)powerhsell下输出: cmake --version呈现如下提醒则装置胜利 cmake version 3.21.2CMake suite maintained and supported by Kitware (kitware.com/cmake).2. 装置git(请自行装置并实现环境配置)powerhsell下输出: git --version呈现如下提醒则装置胜利 git version 2.31.1.windows.13. windows build toolsnpm install --global --production windows-build-tools不论你有没有visual studio 2017/2019(不是带CODE的那个), 都能够装置这个build tools这个也有相干的坑, 请查看https://blog.csdn.net/weixin_... 4. 装置opencv4nodejs(巨坑)千万不要应用主动装置脚本, 肯定要手动装置 3.1 设置手动装置# on windows:set OPENCV4NODEJS_DISABLE_AUTOBUILD=13.2 查看chocolatey版本, 如果没有装置则自行装置choco --version呈现这行绿字就是胜利了 Chocolatey v0.10.153.3 装置opencv# to install OpenCV 4.1.0choco install OpenCV -y -version 4.1.0这个opencv不是opencv4nodejs, 然而前面有大用记住它的装置门路, 我的是在'C:\tools\opencv' 3.4 为opencv增加环境变量在刚刚装置的opencv门路下, 有一个build文件夹, 外面蕴含着咱们须要的所有货色 OPENCV_DIRC:\tools\opencv\buildOPENCV_INCLUDE_DIRC:\tools\opencv\build\includeOPENCV_BIN_DIRC:\tools\opencv\build\x64\vc15\binOPENCV_LIB_DIRC:\tools\opencv\build\x64\vc15\libx64是64位vc15是visual studio 2017, 代表我应用的是2017版本的visual studio.请确保这四个环境变量没有谬误, 这很重要 ...

August 29, 2021 · 2 min · jiezi

关于node.js:express4版本中的bodyParser已被弃用报错解决方案

问题形容应用node中的express框架搭建好后端服务当前,须要接管相应的get、post、put、delete申请等。对于post申请接参数,以前的时候,咱们是下载body-parser插件包解析,而后在post申请的申请体req.body中就能拿到相应申请参数了。然而当初搭建express我的项目咱们会发现,竟然报错了,说bodyParser被弃用了,报错图如下: 报错截图 报错起因咱们晓得bodyParser插件包能将表单里的数据格式化,不便咱们取参,在express4版本之前,都是以npm包的模式应用,想要应用bodyParser须要npm下载对应包,而后require引入包应用即可。然而设计express的大佬们发现bodyParser使用量很高、而且源代码优质简洁,所以罗唆就把bodyParser的源代码退出到express的源代码中去了,集成当前,开发者就能够摈弃以前的形式,应用新的形式,这样的话,更加方便快捷。 原来的写法const express = require('express');const app = express();var bodyParser = require('body-parser');//须要npm下载并引入bodyParser的包,能力失去post申请的参数app.use(bodyParser.json());app.use(bodyParser.urlencoded({extended: false}));app.get('/', (req, res)=>{ res.send('Hello world');});app.post('/postTest', (req, res)=>{ console.log('post申请体传参',req.body); res.send('post申请测试');});app.listen(8083, ()=>{ console.log('服务启动中')})当初的写法const express = require('express');const app= express();app.use(express.urlencoded({extended: false})); // 当初就不便多了,express的两个办法一执行就行啦app.use(express.json());app.get('/', (req, res)=>{ res.send('Hello world');});app.post('/postTest', (req, res)=>{ console.log('post申请体传参',req.body); res.send('post申请测试');});app.listen(8083, ()=>{ console.log('服务启动中')})总结比照一下原来的写法的第三行、第四行、第五行的,和当初的写法第三行、第四行,咱们就能够显著看出,express4版本当前当初的写法更加简洁。 留神:app.use(express.urlencoded({extended: false}))和app.use(express.json())这两个语句,要放在express实例对象挂载url路由之前,就是放在app.get( )、app.post( )之前。失常状况下,node我的项目中url路由都是模块化拆分解决,所以就是要放在app.use(allRouter)之前。就是解析post申请参数的两个语句的地位优先级比拟高。另外说一下,尽管咱们的编辑器(vscode)会提醒这样的body-parser被弃用的相干文字介绍,然而,实际上,在express4版本中npm装置bodyparser包也是能够应用的,也是可能接管到post申请中的参数的,然而,咱们还是依照最新的写法来会好些...

August 27, 2021 · 1 min · jiezi

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

Node.js 是一个基于 Chrome V8 引擎 的 JavaScript 运行时环境。在 Node.js 呈现之前,JavaScript 通常作为客户端程序设计语言应用,以 JavaScript 写出的程序常在用户的浏览器上运行。Node.js 的呈现使 JavaScript 也能用于服务端编程。 MQTT 是一种基于公布/订阅模式的轻量级物联网音讯传输协定,能够用极少的代码和带宽为联网设施提供实时牢靠的音讯服务,它广泛应用于物联网、挪动互联网、智能硬件、车联网、电力能源等行业。 本文次要介绍如何在 Node.js 我的项目中应用 MQTT 实现客户端与 MQTT 服务器的连贯、订阅、勾销订阅、收发音讯等性能。 MQTT 客户端库抉择MQTT.js 是一个 MQTT 协定的客户端库,应用 JavaScript 编写,用于 Node.js 和 浏览器环境中。是 JavaScript 生态中目前应用最为宽泛的 MQTT 客户端库。 我的项目初始化确认 Node.js 版本本我的项目应用 Node.js v14.14.0 进行开发和测试,读者可用如下命令确认 Node.js 的版本 node --versionv14.14.0应用 npm 装置 MQTT.js 客户端库# 新建我的项目npm init -y# 装置依赖npm install mqtt --save实现后咱们在当前目录下新建一个 index.js 文件作为我的项目的入口文件,在该文件中来实现 MQTT 连贯测试的残缺逻辑。 Node.js MQTT 应用连贯 MQTT 服务器本文将应用 EMQ X 提供的 收费公共 MQTT 服务器,该服务基于 EMQ X 的 MQTT 物联网云平台 创立。服务器接入信息如下: ...

August 27, 2021 · 2 min · jiezi

关于node.js:NodeOBS直播服务器搭建总结

导语:最近钻研了一下网页直播流的原理以及实现,当初就目前的实现办法做一个总结。目录直播流媒体协定拉流与推流Node服务搭建前端播放页面OBS推流配置直播流媒体协定先来理解一下根本的直播流媒体协定。 http-flv,rtpm 协定/特点开发者原理长处毛病http-flvAbode通过服务器把flv下载到本地缓存,而后通过NetConnection本地连接播放节俭服务器耗费保密性差rtmpAbode通过NetConnection连贯到服务器,实时播放服务器的flv保密性好耗费服务器资源rtsp哥伦比亚大学、网景和RealNetworks管制具备实时个性的数据的发送,依赖传输协定实时成果十分好实现简单hls苹果公司包含一个m3u(8)的索引文件,TS媒体分片文件和key加密串文件,不将TS切片文件存到磁盘,而是存在内存当中极大缩小了磁盘的I/O次数,缩短了服务器磁盘的使用寿命,极大进步了服务器运行的稳定性会生成大量的文件,存储或解决这些文件会造成大量资源节约拉流与推流推流,指的是把采集阶段封包好的内容传输到服务器的过程。 拉流, 指服务器已有直播内容,用指定地址进行拉取的过程。 Node服务搭建装置依赖包这次应用node-media-server包,来搭建,获取更多请拜访。 mkdir livecd livenpm init -ynpm i node-media-server引入包,编写配置文件 // server.jsconst nodeMediaServer = require('node-media-server');const config = { rtmp: { port: 3001, chunk_size: 6000, gop_cache: true, ping: 30, ping_timeout: 60 }, http: { port: 3002, allow_origin: "*" }}const nms = new nodeMediaServer(config);nms.run();启动当前会输出一下内容 D:\live>node server.js2021/8/22 14:52:19 9588 [INFO] Node Media Server v2.3.82021/8/22 14:52:19 9588 [INFO] Node Media Rtmp Server started on port: 30012021/8/22 14:52:19 9588 [INFO] Node Media Http Server started on port: 30022021/8/22 14:52:19 9588 [INFO] Node Media WebSocket Server started on port: 3002如果打印出以上内容,阐明一个rtmp的直播服务器就曾经搭建胜利了。 ...

August 22, 2021 · 1 min · jiezi

关于node.js:pupeteer启动出错

景象linux-686378/chrome-linux/chrome: error while loading shared libraries: libX11.so.6: cannot open shared object file: No such file or directory通过下面信息显示,咱们的零碎短少启动chorme的库。 解决一于是去搜寻装置libX11.so.6库,通过查找发现在不同Linux零碎上安装包的名字不一样,在centOS下我抉择了libX11-devel这个库。 解决二装置完之后再次尝试启动,发现有报错,显示短少了另一个库libXcomposite.so.1。预计后续还会短少其余库,这样一直尝试太麻烦了。好在找到了一个文档,下面介绍了查看短少那些库的办法,并且给出了零碎依赖库:https://github.com/puppeteer/...在chomme程序文件夹里执行: ldd | grep not如果你是Linux零碎并且通过 npm i pupeteer装置的,在node_modules/pupeteer/.local-chromium/linux-686378/chrome-linux/chrome下运行,查看还短少哪些库。如下图: 最终解决方案其实失去了短少的库也还是不晓得装什么库,因为零碎版本不同对应的库名字不同 本人尝试间接装置显示的名字,发现并不好使⚠️。能够尝试应用文档给出的依赖装置,对于字体的不是必须的。(这个形式我没试过)从网上查到了一个能够实操的装置:ubuntu: apt install gconf-service libasound2 libatk1.0-0 libc6 libcairo2 libcups2 libdbus-1-3 libexpat1 libfontconfig1 libgcc1 libgconf-2-4 libgdk-pixbuf2.0-0 libglib2.0-0 libgtk-3-0 libnspr4 libpango-1.0-0 libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 libxcomposite1 libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 libxtst6 ca-certificates fonts-liberation libappindicator1 libnss3 lsb-release xdg-utils wgetcentos: yum -y install libX11 libXcomposite libXcursor libXdamage libXext libXi libXtst cups-libs libXScrnSaver libXrandr alsa-lib pango atk at-spi2-atk gtk3如果须要docker装置的话, 记得dockerfile中退出 --assume-yes 用于确认是否持续。 ...

August 19, 2021 · 1 min · jiezi

关于node.js:如何开发-Nodejs-Native-Addon

简介: 来一起为 Node.js 的 add-on 生态做奉献吧~作者 | 吴成忠(昭朗) 这篇文章是由 Chengzhong Wu (@legendecas),Gabriel Schulhof (@gabrielschulhof) ,Jim Schlight (@jimschlight),Kevin Eady,Michael Dawson (@mhdawson1),Nicola Del Gobbo (@NickNaso) 等人编写的,首发在 Node.js Medium 博客。 对于N-APIN-API 为 Node.js 带来了一个 ABI 稳固的 add-on API,简化了构建和开发反对跨 Node.js 版本的 add-on 的累赘。 目前 N-API 的 C++ 封装 node-addon-api 每周的下载量曾经超过了 250万次,并且所有 Node.js LTS(长期反对版本)都曾经反对了 N-API v3 或者更高版本 ,Node.js 15.x 更曾经开始反对最新的 N-API v7。所以咱们认为这是一个十分好的工夫点来回头看一看目前 Node.js add-on 的开发体验。 当咱们在 2016 年开始投入 N-API 的工作(最开始的提案是在 2016 年 12 月 12 日提出的),咱们就晓得这会是一个十分长期的工作。Node.js 社区生态中曾经有十分多现存的包,所以这个迁徙过程将会继续相当长的一段时间。 ...

August 13, 2021 · 3 min · jiezi