判断是node环境还是浏览器环境
if(typeof module !== "undefined" && module.exports){ //node }else { //浏览器 }
npm有nrm,我yarn怎么能没有呢全局安装npm install -g yrm --registry=https://registry.npm.taobao.org安装完毕,查看ls列表yrm ls如果提示你什么禁止运行脚本,且是win10 powerShell的话可以这样做:get-executionpolicy //他会返回Restricted set-executionpolicy remotesigned //旧win10可以用,新版不行 Set-ExecutionPolicy -Scope CurrentUser //最新win10使用该命令,输入完会让你输入...
npm换源应该是国内的基本操作了,但是每次用的时候,可能是百度啊,各种搜,总之搜到的结果,可能都很一般,不是你复制我,就是我复制你,东西缺胳膊少腿是常有的事。为此,npm有一个插件,可以快速的进行源的切换,而且方便,还能测速。首先我们需要安装,务必全局nrmnpm install -g nrm安装完毕后我们可以查看源列表nrm ls如果提示你什么禁止运行脚本,且是win10 powerShell的话可以这样做:get-executionpolicy //他会返回Restricted set-executionpolicy remotesigned //旧win10可以用,新版不行...
听别人说node可以写爬虫,然后我去尝试了一下,有点累啊,大概原理其实用jq都能做出来效果,只是说没有后台操作了。原理利用http模块发出请求获取到网页信息通过cheerio插件进行提取信息保存遇到的一些问题首先就是提取信息,因为获取到的其实是一个html页面的内容,我们需要进行提取,这里当然用jq会方便很多,但是node里面没有jq,只有cheerio这个伪jq,所以很多jq的方便的方法,使用这个插件用不出来。特别是$(".box:nth-child(2)")这种选择器就无法使用,只能通过eq,和find进行截取,然后再each循环,性能上应该很浪费。转义有的站点他...
我找了很多个插件,发现都好难用,npm哪里的说明等于没有,你根本不知道他哪些配置参数怎么弄,百度的文章真的是五花八门,不是抄就是缺胳膊短腿, 想来想去还是自己写好了。日志的格式我是仿 koa-logger,我感觉他这个样式还不错,但是他这个插件只能console输出,如果是测试环境,还行,但是上线后作为日志保存,就不太行。我尝试去用他的方法去保存,会乱码,编码我也设置为utf8了,所以无解啊。(超蛋疼有没有)预览相对来说还是比较简单。原理通过中间件的形式,正常请求和发生错误,为此,我们需要创建一个全局的错误处理中间件,在这个里面我们触发自己写的日志方法。const logger = re...
centos 跨域模板location * { add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS,DELETE,PATCH'; add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Contr...
首先我们需要安装node,具体本博客搜索node,有一篇对应的教程。首先我们需要宝塔,因为需要ng反代,node他本身不能绑定域名的,所以就很蛋疼,如果我们还要配置https,用node来做就头疼的要死,用宝塔不到三分钟就搞定了。[hide]部署文件我们创建一个用于存放serve服务的文件夹,然后将server后端的一系列文件都传上去。cd /xxx/xx/xxx/xx 进入你的存放文件的目录此时我们可以像平时一样输入node server.js来启动后端服务,此时我们可以进行调试的。但是有个问题,这样启动的话,ssh命令界面一关闭,这个服务也就关闭了,我们不可能长期开着这个ssh窗口...
生成管理员账号一般如果自己手动去改文件,设置一个name一个password也行,但是太麻烦了,node有一个模块,可以以问题得形式询问用户,然后用户输入内容,回车后会触发一个回调,回调的参数就是用户输入的内容。首先我们需要引入一个官方的模块:readline;libs/rl.jsconst readline = require("readline"); let rl = readline.createInterface({ input: process.stdin, output: process.stdout }); rl.questionAs...
对于密码的话,一般使用md5签名转成唯一的32位字符。md5不管文件有多大,都是只会生成32位,并且同一个文件,签名后结果都是相同的,而且这个结果不能反向破解,只能一个个的试,这种也称为暴力破解。暴力破击可以破解相对比较简单的密码,比如:123456 这种纯数字的。而且就算我们对同一个密码做两次md5,第一次生成的md5,第二次将第一次md5再次签名,一样也容易被人暴力破解。所以一般在第二次加密的时候,使用一段随机的字符,长度无所谓,中文都可以。libs/md5.jsmd5方法需要引入原生加密模块crypto。const crypto = require("crypto&quo...
整合一下服务:核心模块koa 框架koa-router 路由koa-static 发送静态文件(静态化文件)promise-fs 文件读写uuid 全局唯一标识符数据处理koa-better-body post数据和文件koa-convert koa-better-body的转换async方式的插件memorystream 内存流,高速数据生成promise-mysql 数据库sessionkoa-session sessionredis和bluebird redis后端渲染koa-ejs目录结构libs 用于存放自己写的通用模块log 用于存...
使用mysql的话,虽然很稳定,但是相对读写来说,速度没有放在内存中快,于是我们可以使用redis首先是安装由于redis是针对linux的,window版本则是由微软小组进行转制作维护的,下载地址在githubredislinux版直接官网下载,或者用宝塔直接装。window版本的已经很老了,只有3.0,现在官网都6.0了,github是16年更新的。找到一个非官方的版本,目前更新到5.0了redis下载zip文件,解压打开redis server即可。使用需要安装两个插件,一个是redis,一个是用于将redis的老方法转为新异步方法的插件bluebirdnpm i redis bl...
session 的一些问题无法共享,因为所有网站不可能共用一台服务器,可能会有多个不安全,如果服务器崩溃,数据也会丢失性能低,普通的session文件都是存放本地,io非常慢(相对)于是就有两中方式进行优化:丢数据库mysql丢redis中mysqlkoa作者提供了一个接口store,这个接口也是在session的配置对象里的,他是一个对象,里面有三个生命周期函数,我称之为生命周期函数。他们会在session操作完后触发。server.use(session({ maxAge: 20 * 60 * 1000, renew: true, store: { ...
cookiecookie用于判断用户是谁,一般都是使用签名算法进行加密。加上cookie本身大小有限制,总大小才32k,头信息也才32k,所有不能太大,而且不能太多,最多20条,容量这样一算的话,单条才4k。koa创建cookie直接通过ctx对象:ctx.cookies.set(key,value);读取:ctx.cookies.get(key);签名server.keys = ["aaaa", "bbbb", "cccc"]; router.get("/", async ctx => { ct...
FormData是一种容器,用于模拟表单,向服务器发送数据,简单点来讲,他就是一个对象,键值对形式的对象。创建方式new出一个FormData对象,然后手动传入参数直接使用一个from元素转成FormData对象使用方式原生ajax配合使用let form = new FormData(); form.append("name","mulingyuer"); form.append("pass","123456"); let xhr = new XMLHTTPRequest(); xhr.open(&q...
禁用不处理文件禁用文件上传//post数据中间件 server.use(convert(body({ multipart : true })));buffer另一种文件上传形式,也是布尔值//post数据中间件 server.use(convert(body({ buffer : true })));限制上传大小有三个设置:maxFieldsSize 限制一个字段的最大大小 (默认20mb)maxFileSize 限制单个文件的最大大小 (默认200mb)maxFields 限制字段数量,比如限制最多20个文件上传 (默认100...
GET数据get的数据相对来时很简单,直接从ctx的query属性里面就可以直接获取到对应的数据router.get("/",async ctx=>{ console.log(crx.query); });POST数据post 相对来说难一点,我们需要使用一个中间件帮助我们获取数据安装:koa-better-bodynpm i koa-better-body由于这个插件使用的是generator,koa会提示这个不推荐的报错,所以我们还需要一个koa的转换插件:koa-convertnpm i koa-convert我们需要在激活body时 ,用conver...
安装npm i koa-static一般建议创建一个目录专门保存静态文件,比如目录名:staticstatic一般放在最末尾use激活,表示如果前面的路由设置,或其他的都没有对应的,就进入的请求文件这。const Koa = require("koa"); const static = require("koa-static"); const server = new Koa(); server.listen(8080); server.use(require("./router")); server.use(stat...
参数koa-router的参数和vue中的router参数一下,一个分号带一个变量名router.get("/news/:id",async ctx=>{ });那么我们要进入这个路径,是一定要带上id的,不然就进不去:loaclhost:8080/news/1231这个id可以是任何值,数字,英文,中文参数也可以多个,这样你访问这个路径也要带上这么多的参数router.get("/news/:id/:a/:eee",async ctx=>{ });路径:localhost:8080/asda/ada/dada如何获取这些参数呢?c...
一定要是使用正统的插件:koa-router,npm官方库有很多擦边球插件,一字之差,所以需要注意了。路由方法路由方法HTTP方法含义.get()GET数组在url中,非特殊约定,一般为urlencoding.post()POST数据在body中.put()PUT数据在body中,一般用于文件上传.patch()PATCH数据在body中,一般用于数据更新.del/delete()DELETE数据在url中,一般用于删除.all() 处理所有的method请求.use() 挂在中间件注意,form表单元素只能提交get和post请求,其他类型的请求需要使用ajax这种方式。其实get和p...
属性获取属性说明可能的值method请求方法GETurl完整请求路径/xxx/xxx/api?xxx=xxxpath路径部分/xxx/xxxqueryget参数{type:‘a’,p:12}querystringget参数字符串?type=a&p=12host域名+端口localhost:8080hostname域名localhostprotocol协议httpsecure是否安全协议falseip访客ip地址xx.xx.xx.xxorigin域:协议+域名+端口http://localhost:8080其中我们可以通过ip属性写一个后台返回ip信息的apiip信息api由于我们要使用第...
最近评论