npm命令,npm源,npm国内源,npm配置
npm
全称Node Package Manager
,是node.js的模块依赖管理工具。由于npm
的源在国外,所以国内用户使用起来各种不方便。下面整理出了一部分国内优秀的npm
镜像资源,国内用户可以选择使用。
npm命令,npm源,npm国内源,npm配置
npm
全称Node Package Manager
,是node.js的模块依赖管理工具。由于npm
的源在国外,所以国内用户使用起来各种不方便。下面整理出了一部分国内优秀的npm
镜像资源,国内用户可以选择使用。
PDF.js是一个用HTML5构建的便携文档格式(PDF)浏览器。
PDF.js是社区驱动的,由Mozilla实验室支持。目标是创建一个通用的、基于web标准的平台,用于解析和呈现pdf。
下面方法是在github中抄来的,我此次的项目是织梦二次开发,也就是说网站php环境的,不是nodejs。客户的需求是上传word文档后,可直接在浏览器中查看,那么我变通一下就是把这些文档转成PDF格式,之后使用PDF.js实现在浏览器中查看。我虽然全局安装了gulp,但是没有使用gulp server这条命令。在测试时访问http://域名/pdf.js/web/viewer.html,viewer.html没有做任何修改,加载了超多的js文件,造成很慢很慢,访问http://域名/pdf.js/examples/components/simpleviewer.html 只加载了必要的js,访问速度还可以。
所以,在使用中,还需要结合自己的实际需求来斟酌、测试。 Continue reading
knex.js是bookshelf框架的基础,其核心是query builder。这篇文章参考自Knex.js官网,翻译并总结了该框架的方法。
0 1 2 |
#以PostgreSql为例 sudo npm install knex --save sudo npm install pg --save |
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
var knex = require('knex')({ client: 'pg', //指明数据库类型,还可以是mysql,sqlite3等等 connection: { //指明连接参数 host : '127.0.0.1', user : 'DatabaseName', password : 'password', database : 'example' }, debug: true, //指明是否开启debug模式,默认为true表示开启 pool: { //指明数据库连接池的大小,默认为{min: 2, max: 10} min: 0, max: 7, }, acquireConnectionTimeout: 10000, //指明连接计时器大小,默认为60000ms migrations: { tableName: 'migrations' //数据库迁移,可选 } }); |
把数据库类型和连接相关的参数配置好之后,才可以正确的连接到数据库,connection的信息可以写到config文件中。
knex框架的方法大致分为几类: Continue reading
普通字符串 编码解码:
0 1 2 3 4 5 6 7 |
// var b = new Buffer('JavaScript'); //也可以这么写,但这是官方提出废弃的,使用 Buffer.from(...) 代替 var b = Buffer.from('JavaScript'); var s = b.toString('base64'); // SmF2YVNjcmlwdA== var b = Buffer.from('SmF2YVNjcmlwdA==', 'base64') var s = b.toString(); // JavaScript |
编码解码并转成hex
0 1 2 3 4 5 6 |
var b = Buffer.from('SmF2YVNjcmlwdA==', 'base64') var s = b.toString('hex'); // 4a617661536372697074 var b = Buffer.from('4a617661536372697074', 'hex') var s = b.toString('utf8'); // JavaScript |
编码解码图片
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
var fs = require('fs'); // function to encode file data to base64 encoded string function base64_encode(file) { // read binary data var bitmap = fs.readFileSync(file); // convert binary data to base64 encoded string return Buffer.from(bitmap).toString('base64'); } // function to create file from base64 encoded string function base64_decode(base64str, file) { // create buffer object from base64 encoded string, it is important to tell the constructor that the string is base64 encoded var bitmap = Buffer.from(base64str, 'base64'); // write buffer to file fs.writeFileSync(file, bitmap); console.log('******** File created from base64 encoded string ********'); } // convert image to base64 encoded string var base64str = base64_encode('kitten.jpg'); console.log(base64str); // convert base64 string back to image base64_decode(base64str, 'copy.jpg'); |
微信小程序引用SDK正确操作数据库方法:
0 1 2 3 4 5 6 7 8 9 10 11 |
// 使用wafer-node-sdk导出的mysql访问接口 const { mysql } = require('../qcloud') module.exports = async (ctx, next) => { await mysql('cSessionInfo').select('*').then(res => { ctx.state.code = 0 ctx.state.data = res }).catch(err => { ctx.state.code = -1 throw new Error(err) }) } |
注意:
1、必须使用await,因为数据库获取是异步返回的,此处折腾了好久,刚开始不知道是异步的,总获取不到信息
2、使用await的情况下,必须使用async,否则会报错
**如果不使用await,打印数据库查询结果为如下形式: Continue reading
守护进程,进程守护,进程管理
PM2是node进程管理工具,可以利用它来简化很多node应用管理的繁琐任务,如性能监控、自动重启、负载均衡等,而且使用非常简单。
下面就对PM2进行入门性的介绍,基本涵盖了PM2的常用的功能和配置。
全局安装,简直不能更简单。
0 |
npm install -g pm2 |
pm2安装好后,会自动创建下面目录。看文件名基本就知道干嘛的了,就不翻译了。
$HOME/.pm2
will contain all PM2 related files$HOME/.pm2/logs
will contain all applications logs$HOME/.pm2/pids
will contain all applications pids$HOME/.pm2/pm2.log
PM2 logs$HOME/.pm2/pm2.pid
PM2 pid$HOME/.pm2/rpc.sock
Socket file for remote commands$HOME/.pm2/pub.sock
Socket file for publishable events$HOME/.pm2/conf.js
PM2 Configuration运行NodeJS抛出异常 Error: listen EADDRINUSE :::3000,解决办法如下:
在系统中正在使用的端口列表
netstat -lntp
查找监听端口号的进程PID(如果可以直观的看到就不用使用这条命令了)
lsof -i :3000
杀死对应进程PID, 如4239
shell> kill -9 4239
做了个Node项目,某个流程中最多五层回调进行逻辑判断,客户还要加一些业务,如果再这么做下去,至少还要加两层回调。就可读性来讲,是很差的。胃有点翻腾,要吐出来了…
在网上查了查,有很多人说Node的回调是个坑,但是个人还是愿意接受这不是Node坑的理论,回调这是Node的一个思想,我们既然选择了使用Node,就应该去分析、理解和适应它。
我相信无论遇到什么问题,总是能解决的。如果现在不能解决,那只是暂时没有想到解决办法而已。
一、generator(生成器)
是ES6标准引入的新的数据类型。一个generator看上去像一个函数,但可以返回多次。
我喜欢并在使用着这种方法,这种方法很优雅。
作用:一是同步流程控制Node回调;二是或以在外层获取回调函数内的返回值;三是如果逻辑判断层级很多,那么使代码的可读性更好; Continue reading
守护进程,进程守护,进程管理
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
npm install forever -g #安装 forever start app.js #启动应用 forever stop app.js #关闭应用 forever restartall #重启所有应用 #输出日志和错误 forever start -l forever.log -o out.log -e err.log app.js # 指定forever信息输出文件,当然,默认它会放到~/.forever/forever.log forever start -l forever.log app.js # 指定app.js中的日志信息和错误日志输出文件, # -o 就是console.log输出的信息,-e 就是console.error输出的信息 forever start -o out.log -e err.log app.js # 追加日志,forever默认是不能覆盖上次的启动日志, # 所以如果第二次启动不加-a,则会不让运行 forever start -l forever.log -a app.js # 监听当前文件夹下的所有文件改动(不太建议这样) forever start -w app.js # 显示所有运行的服务 forever list ######停止操作 # 停止所有运行的node App forever stopall # 停止其中一个node App forever stop app.js # 当然还可以这样 # forever list 找到对应的id,然后: forever stop [id] # 开发环境下 NODE_ENV=development forever start -l forever.log -e err.log -a app.js # 线上环境下 NODE_ENV=production forever start -l ~/.forever/forever.log -e ~/.forever/err.log -w -a app.js #上面加上NODE_ENV为了让app.js辨认当前是什么环境用的 |
基本的使用还是很简单的,进一步使用还没操作,先从网上找点资料放上来,以备后续查看
1.引入MySQLdb库
import MySQLdb
2.和数据库建立连接
conn=MySQLdb.connect(host=”localhost”,user=”root”,passwd=”sa”,db=”mytable”,charset=”utf8″)
提供的connect方法用来和数据库建立连接,接收数个参数,返回连接对象.
比较常用的参数包括
host:数据库主机名.默认是用本地主机.
user:数据库登陆名.默认是当前用户.
passwd:数据库登陆的秘密.默认为空.
db:要使用的数据库名.没有默认值.
port:MySQL服务使用的TCP端口.默认是3306.
charset:数据库编码.
更多关于参数的信息可以查这里
http://mysql-python.sourceforge.net/MySQLdb.html
然后,这个连接对象也提供了对事务操作的支持,标准的方法
commit() 提交
rollback() 回滚
3.执行sql语句和接收返回值
cursor=conn.cursor()
n=cursor.execute(sql,param)
首先,我们用使用连接对象获得一个cursor对象,接下来,我们会使用cursor提供的方法来进行工作.这些方法包括两大类:1.执行命令,2.接收返回值
cursor用来执行命令的方法:
callproc(self, procname, args):用来执行存储过程,接收的参数为存储过程名和参数列表,返回值为受影响的行数
execute(self, query, args):执行单条sql语句,接收的参数为sql语句本身和使用的参数列表,返回值为受影响的行数
executemany(self, query, args):执行单条sql语句,但是重复执行参数列表里的参数,返回值为受影响的行数
nextset(self):移动到下一个结果集
cursor用来接收返回值的方法:
fetchall(self):接收全部的返回结果行.
fetchmany(self, size=None):接收size条返回结果行.如果size的值大于返回的结果行的数量,则会返回cursor.arraysize条数据.
fetchone(self):返回一条结果行.
scroll(self, value, mode=’relative’):移动指针到某一行.如果mode=’relative’,则表示从当前所在行移动value条,如果mode=’absolute’,则表示从结果集的第一行移动value条.
下面的代码是一个完整的例子.
#使用sql语句,这里要接收的参数都用%s占位符.要注意的是,无论你要插入的数据是什么类型,占位符永远都要用%s
sql=”insert into cdinfo values(%s,%s,%s,%s,%s)”
#param应该为tuple或者list
param=(title,singer,imgurl,url,alpha)
#执行,如果成功,n的值为1
n=cursor.execute(sql,param)
#再来执行一个查询的操作
cursor.execute(“select * from cdinfo”)
#我们使用了fetchall这个方法.这样,cds里保存的将会是查询返回的全部结果.每条结果都是一个tuple类型的数据,这些tuple组成了一个tuple
cds=cursor.fetchall()
#因为是tuple,所以可以这样使用结果集
print cds[0][3]
#或者直接显示出来,看看结果集的真实样子
print cds
#如果需要批量的插入数据,就这样做
sql=”insert into cdinfo values(0,%s,%s,%s,%s,%s)”
#每个值的集合为一个tuple,整个参数集组成一个tuple,或者list
param=((title,singer,imgurl,url,alpha),(title2,singer2,imgurl2,url2,alpha2))
#使用executemany方法来批量的插入数据.这真是一个很酷的方法!
n=cursor.executemany(sql,param)
4.关闭数据库连接
需要分别的关闭指针对象和连接对象.他们有名字相同的方法
cursor.close()
conn.close()
四步完成,基本的数据库操作就是这样了.下面是两个有用的连接
MySQLdb用户指南: http://mysql-python.sourceforge.net/MySQLdb.html
MySQLdb文档: http://mysql-python.sourceforge.net/MySQLdb-1.2.2/public/MySQLdb-module.html