总结 CNode 社区 BBS 都用了哪些模块
发布于 6 年前 作者 liangtongzhuo 4224 次浏览 来自 分享

前言

看 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 里的模块过了一遍。以上有很多模块都没用过,如有纰漏请留言提醒。

12 回复

大佬,cnode源码我在哪里可以看呢QAQ

新手教程里面很多东西

http常用的也就那些,很多场景都能直接想到模块包名。 另一些的话可能是临时搜来用的,比如 bcryptjs 这个,是因为以前cnode这边的密码都是md5直接存储,salt都没有。后来改造的时候读了一些文章,发现 bcrypt 比较好。这个 bcrypt 有原生计算版本,和 bcryptjs 这个js版本。后者容易造成进程堵塞。不过考虑到我们的用户量和源码示范效应(省去其他人在部署时的跨平台问题),就用了js版本的。

egg-cnode 里的 egg-passport 有大神能讲解一下吗?

@thonatos 我在 github 上提了个 issue,关于 passport 无法鉴权的,不知道您能否解答一下。https://github.com/eggjs/egg/issues/2355#issuecomment-380045793 自豪地采用 CNodeJS ionic

@JZLeung

回复过了,仔细检查一下代码吧,代码都一样不能跑那就检查环境或者使用方法呗

@thonatos 同样的代码,同样的环境。在我的一个 demo 上能跑起来。但是我新建的一个项目就不行了。

回到顶部