前言
看 CNode 社区源码的时候,发现好多第三方模块有的没见过,在这里统一总结他们的作用。
async
解决异步回调过深的库。
async.auto({
result1: function (callback) { setTimeout(function () { callback(null, 'functionResult1') }, 2000) },
result2: function (callback) { setTimeout(function () { callback(null, 'functionResult2') }, 1000) },
result3: ['result1', 'result2', function (callback, replyData) { setTimeout(function () { callback(null, replyData.result1 + replyData.result2); }, 1000) }]
}, function (err, data) { console.log(data) });
结果输出为: { result2:functionResult2, result1:functionResult1, result3:functionResult1functionResult2 }
bcryptjs
bcryptjs 是一个第三方密码加密库,是对原有bcrypt的优化,优点是不需要安装任何依赖。
body-parser
body-parser 是一个HTTP请求体解析中间件。
bytes
转换字符串为字节单位的数字
bytes(1024);
// output: '1KB'
bytes(1000);
// output: '1000B'
bytes(1000, {thousandsSeparator: ' '});
// output: '1 000B'
bytes(1024 * 1.7, {decimalPlaces: 0});
// output: '2KB'
bytes(1024, {unitSeparator: ' '});
// output: '1 KB'
colors
可以使用 console.log 控制台打印改变颜色
var colors = require('colors');
console.log('hello'.green); // outputs green text
console.log('i like cake and pies'.underline.red) // outputs red underlined text
console.log('inverse the color'.inverse); // inverses the color
compression
启用 Gzip 压缩
var compression = require('compression');
app.use(compression());
connect-busboy
文件上传
connect-redis
这是一个关于 session 的持久化插件, 配合 express-session使用。此模块基于redis,将 session 相关信息持久化。根据 express 的文档,我们只要实现其所要求的部分方法即可。
var session = require('express-session');
var RedisStore = require('connect-redis')(session);
app.use(session({
store: new RedisStore(options),
secret: 'keyboard cat',
resave: false
}));
cookie-parser
解析 cookie
var express = require('express')
var cookieParser = require('cookie-parser')
var app = express()
app.use(cookieParser())
cors
解决跨域
var express = require('express')
var cors = require('cors')
var app = express()
app.use(cors())
app.get('/products/:id', function (req, res, next) {
res.json({msg: 'This is CORS-enabled for all origins!'})
})
app.listen(80, function () {
console.log('CORS-enabled web server listening on port 80')
})
csurf
CSRF(Cross Site Request Forgery, 跨站域请求伪造)是一种网络的攻击方式,防止这种攻击的一个中间件。 贴一个 IBM 介绍 CSRF 的文章:https://www.ibm.com/developerworks/cn/web/1102_niugang_csrf/index.html
data2xml
JSON 转换 XML
var data2xml = require('data2xml');
var convert = data2xml();
var xml1 = convert('Message', 'Hello, World!');
console.log(xml1);
// ->
// <?xml version="1.0" encoding="utf-8"?>
// <Message>Hello, World!</Message>
var xml2 = convert('Message', {
Text: 'Hello, World!'
});
console.log(xml2);
// ->
// <?xml version="1.0" encoding="utf-8"?>
// <Message><Text>Hello, World!</Text></Message>
ejs-mate
(作者 朴灵) 模版引擎
eventproxy
(作者 朴灵) 解决异步回调和并发控制,我接触 Node 的时候已经有 Promise 了,eventproxy 并没有在项目中用过,但是这种思路非常棒。
var ep = new EventProxy();
ep.all('tpl', 'data', function (tpl, data) { // or ep.all(['tpl', 'data'], function (tpl, data) {})
// 在所有指定的事件触发后,将会被调用执行
// 参数对应各自的事件名
});
fs.readFile('template.tpl', 'utf-8', function (err, content) {
ep.emit('tpl', content);
});
db.get('some sql', function (err, result) {
ep.emit('data', result);
});
express
Web 框架,封装了原生HTTP,提供了中间件串行的方式
express-session
session 中间件
helmet
安全性相关的HTTP头,相关文章:https://segmentfault.com/a/1190000003860400
ioredis
作者 luin,node 下 redis 包
jpush-sdk
极光推送
loader-builder
(作者 朴灵)用于Loader的构建器。构建器用于扫描制定目录的视图文件,将Loader语法的调用提取出来,生成资源文件的关系映射。同时还对.less、.styl、.coffee、.es格式的文件进行编译,将其转换为普通的.js、.css文件。同时还会将编译好的文件通过uglify/cleancss进行压缩。对同一个Loader标签下的js和css文件,还会将其combo成一个文件,并计算出hash。
loader
(作者 朴灵) Node静态资源加载器。该模块通过两个步骤配合完成,代码部分根据环境生成标签。上线时,需要调用minify方法进行静态资源的合并和压缩
lodash
lodash是一个具有一致接口、模块化、高性能等特性的javascript工具库,是underscore.js 的 fork
log4js
日志模块
var log4js = require('log4js');
var logger = log4js.getLogger();
logger.level = 'debug';
logger.debug("Some debug messages");
[2010-01-17 11:43:37.987] [DEBUG] [default] - Some debug messages
markdown-it
markdown 解析
memory-cache
内存缓存
var cache = require('memory-cache');
// now just use the cache
cache.put('foo', 'bar');
console.log(cache.get('foo'));
method-override
如果客户端不支持 PUT DELETE,可以用此包。设置请求头达到访问 PUT DELETE 路由。
var express = require('express')
var methodOverride = require('method-override')
var app = express()
// override with the X-HTTP-Method-Override header in the request
app.use(methodOverride('X-HTTP-Method-Override'))
----
Example call with header override using XMLHttpRequest:
var xhr = new XMLHttpRequest()
xhr.onload = onload
xhr.open('post', '/resource', true)
xhr.setRequestHeader('X-HTTP-Method-Override', 'DELETE')
xhr.send()
function onload () {
alert('got response: ' + this.responseText)
}
moment
时间格式化
mongoose
mongoose是 MongoDB ORM
multiline
多行字符串拼接 = =,好没用。
Before
var str = '' +
'<!doctype html>' +
'<html>' +
' <body>' +
' <h1>❤ unicorns</h1>' +
' </body>' +
'</html>' +
'';
----
After
var str = multiline(function(){/*
<!doctype html>
<html>
<body>
<h1>❤ unicorns</h1>
</body>
</html>
*/});
node-uuid
生成UID(唯一标识符)
nodemailer
发送邮件
nodemailer-smtp-transport
SMTP module with for Nodemailer.
passport
权限验证中间件,可以用来验证密码
passport-github
GitHub using the OAuth 2.0 API.
pm2
部署管理 Node
qn
(作者 苏千)七牛文件存储模块
ready
加入一些钩子事件,我不太清楚作用。文档地址:https://www.npmjs.com/package/ready
request
封装了 HTTP ,使用更简单
response-time
记录请求与返回之间的时间,原理: https://www.liaoxuefeng.com/article/0014007460517001bbb3e2f624a4917b742635e9a6b15dd000
superagent
也是一个封装请求的库
request
.post('/api/pet')
.send({ name: 'Manny', species: 'cat' }) // sends a JSON post body
.set('X-API-Key', 'foobar')
.set('accept', 'json')
.end((err, res) => {
// Calling the end function will send the request
});
utility
(作者 苏千 死马)一些有工具 MD5 时间格式化之类
validator
验证字符串,免去写正则
var validator = require('validator');
validator.isEmail('foo@bar.com'); //=> true
xmlbuilder
关于 xml
var builder = require('xmlbuilder');
var xml = builder.create('root')
.ele('xmlbuilder')
.ele('repo', {'type': 'git'}, 'git://github.com/oozcitak/xmlbuilder-js.git')
.end({ pretty: true});
console.log(xml);
will result in:
<?xml version="1.0"?>
<root>
<xmlbuilder>
<repo type="git">git://github.com/oozcitak/xmlbuilder-js.git</repo>
</xmlbuilder>
</root>
xss
(作者 leizongmin)防止 xss 攻击,过滤一些标签。
结尾
写了一大堆,终于把 CNode dependencies 里的模块过了一遍。以上有很多模块都没用过,如有纰漏请留言提醒。
大佬,cnode源码我在哪里可以看呢QAQ
新手教程里面很多东西
thank ~
http常用的也就那些,很多场景都能直接想到模块包名。 另一些的话可能是临时搜来用的,比如 bcryptjs 这个,是因为以前cnode这边的密码都是md5直接存储,salt都没有。后来改造的时候读了一些文章,发现 bcrypt 比较好。这个 bcrypt 有原生计算版本,和 bcryptjs 这个js版本。后者容易造成进程堵塞。不过考虑到我们的用户量和源码示范效应(省去其他人在部署时的跨平台问题),就用了js版本的。
egg-cnode 里的 egg-passport 有大神能讲解一下吗?
666
@thonatos 我在 github 上提了个 issue,关于 passport 无法鉴权的,不知道您能否解答一下。https://github.com/eggjs/egg/issues/2355#issuecomment-380045793 自豪地采用 CNodeJS ionic
回复过了,仔细检查一下代码吧,代码都一样不能跑那就检查环境或者使用方法呗
@thonatos 同样的代码,同样的环境。在我的一个 demo 上能跑起来。但是我新建的一个项目就不行了。