Quantcast
Channel: CNode:Node.js专业中文社区
Viewing all 14821 articles
Browse latest View live

开源一个项目: 通用 RBAC 系统,统一用户权限系统, 统一授权及访问控制.

$
0
0

最近一段时间工作之余都在开发这个项目. 希望大家能够用到. 主要技术都是NodeJS. 目前已经发布到GitHub上了. 也部署了在线体验的地址. 直接贴一下项目介绍吧:

GitHub地址:

https://github.com/iGeeky/wolf

Introductions

wolf是一个通用RBAC系统,适用于所有的HTTP应用.统一授权及访问控制.

每个公司内部会有各种不同的后台服务及相应的管理后台.通常不同的系统会有一套自己的账号系统及权限管理模块。重复的开发使得开发资源浪费.并且不统一的账号,造成管理上的混乱。如果系统是由不同的团队来开发,这种情况将更糟糕.

本系统可以应用于各种平台,及各种系统之上. 统一账号及统一授权.并且各系统无需任何开发工作.

演示地址:

账号密码, 请访问GitHub查看.

Features

  • 语言无关,任何HTTP程序都能使用,包括但不限于:纯静态网页,JSP,PHP,ASP,PYTHON,NODE JS等WEB系统
  • 低耦合, 无侵入性, 支持新的应用不需要对应用进行任何修改与改造, 系统在代理层对资源权限进行管理
  • 自带管理后台(console模块),可对应用用户角色, 权限资源进行管理
  • 支持Restful接口, 也支持后端渲染的纯html应用
  • 支持访问日志记录与查询, 以进行审计及问题追溯.
  • 系统有三大模块:
    • Wolf-Server 服务实现,管理后台功能实现
    • Wolf-Console 管理后台前端代码实现
    • Wolf-Agent RBAC的Access Check代理
  • 系统包含以下实体对象:
    • Application, 应用, 支持多应用. 不同的应用可以拥有不同的权限,角色及资源. 可以查看应用下的RBAC对象关系图表.
    • User, 用户, 整体系统共享用户. 可以给用户授权的对象包括:
      • 管理员权限, 设置为管理员的用户可以登陆Console管理后台,并对应用进行管理
      • 应用列表, 可以为用户分配零到多个应用. 根据用户类型不同, 应用列表的意义也不同:
        • 对于管理员用户, 表示可以对这些应用进行管理.
        • 对于非管理员用户, 表示可以对这些应用进行登陆及使用
      • 角色, 可以为用户分配多个角色, 用户最终拥有的权限是所有角色的权限的合集
      • 权限, 可以直接为用户分配权限. 虽然标准的RBAC模型中通常不支持这种方式, 但是本系统支持
    • Role, 角色, 角色可以包含一组权限.
    • Category, 权限分类, 一种对权限进行分类(分组)的方式, 方便管理, 通常可以按大的功能模块进行分类. 在系统中权限选择框中会按分类对权限进行分组显示.
    • Permission, 权限, 权限与资源是一对多的关系, 可以一个资源一个权限, 也可以多个资源使用同一个权限.
    • Resource, 资源, 目前主要是HTTP请求. 资源的属性Match Type + Name + Action确定一条唯一的资源. 一个资源最重要的4元组是:
      • Match Type, URL匹配类型, 支持精确匹配后缀匹配前缀匹配三种模式
      • Name, 指请求的HTTP URL. 如果是精确匹配前缀匹配, 通常是以/开头. 如果是后缀匹配, 通常是资源共有的后缀, 如: .jpg, .js, 不支持通配符或正则.
      • Action, 指请求的HTTP Method. 方法ALL能匹配所有方法.
      • Permission, 指定访问该资源需要的权限. 两个内置权限: Allow All表示所有用户可访问, Deny All表示所有用户不可访问.
    • Audit Log, 审计日志, 记录了所有经过本系统的访问情况(包含Wolf-Console及本系统管理的应用). 记录了以下主要信息:
      • 用户ID, 用户名, 用户昵称
      • 访问日期, 时间及访问者的IP
      • HTTP方法,及URL,
      • 匹配上的资源.
      • 访问响应的状态码.
      • 请求args参数或request body(只支持了Wolf-Console的记录).
  • 资源匹配方式, 支持不同的优先级, 优先级规则如下:
    • Match Type优先级从高到低, 依次是: 精确匹配, 后缀匹配, 前缀匹配.
    • ActionHTTP Method. ALL优先级比较低, 其它方法(如GET, POST, PUT)优先级相同, 但都比ALL高.
    • NameHTTP URL. 优先级与URL长度有关, URL越长优先级越高.

注意: 本文中的URL仅指URL标准中的path部分, 不包含域名,端口及参数部分

Architecture

Architecture

Technologies

  • Server: NodeJS, KOA, Sequelize, JWT
  • Console: VueJS, Element, Babel, NodeJS
  • Agent: OpenResty(ngx_lua)
  • Database: PostgreSQL.

更多信息, 请访问GitHub https://github.com/iGeeky/wolf

欢迎star, 欢迎PR, 欢迎fork, 欢迎提意见,建议及BUG.

声明:

  • 不是上班时间写的! 不是上班时间写的! 不是上班时间写的!
  • 没有使用公司电脑! 没有使用公司电脑! 没有使用公司电脑!

每日有限 的配送都是东西没有收到,却自动签收的吗?

$
0
0

本人这月买了几次订单,每次都是自动签收,连电话都没打一个。 有几单的东西丢了,去投诉,告诉我配送成功(QTMGB)!
失望了,再也不去这个app上买东西了,没有收到东西去投诉,申诉失败原因(配送成功)。 每日优鲜,这么个小厂,就这么缺这点钱的吗?

小白疑问: 写过java,入门后端node框架的话,感觉 egg 比 nest 的代码复杂一些, 是因为 ts和js的区别吗?

前台 vue ssr ,后台react 多权限管理的发布系统,仿掘金

$
0
0

这个项目用了 react、vue、node 、webpack、grophql、express 基本涉及到了前端大部分主流的技术了,都是用的最新的版本,都是从零开始搭建包括 ssr 脚手架,主要是让学的人,接触前端整个的生态圈,后期 node 会用 ts 重构,而且会根据所有框架的版本实时更新项目

不耻的来求点赞

预览地址 :xiaosuibi项目地址 :kite

哈哈,第二次了

疑似在`sofa-rpc-node`模块中对dubbo协议支持的一个小问题

$
0
0

更新:我甚至已经直接提交了一个PR

我们发现使用dubbo提供rpc时,客户端无法调用,直接报错,而且java的报错信息非常长啊,经排查,注册到zk的url缺少了pathname部分,这部分在dubbo的官方文档中是表示 接口名称 参考链接:https://dubbo.apache.org/zh-cn/blog/introduction-to-dubbo-url.html

Dubbo 中的 URL
在 dubbo 中,也使用了类似的 URL,主要用于在各个扩展点之间传递数据,组成此 URL 对象的具体参数如下:
protocol:一般是 dubbo 中的各种协议 如:dubbo thrift http zk
username/password:用户名/密码
host/port:主机/端口
path:接口名称
parameters:参数键值对

我修改了这部分之后,rpc服务能正常处理和返回数据了,不知道有木有其他大神遇到这样的情况,以及是怎样处理的?

mysql里的布尔node中咋拿

$
0
0

mysql数据库里的布尔类型转换成0和1了,那我想拿到true和false怎么操作呢 来个大佬详细的说一下

我还是来测试下的哦哈哈哈

Async 版本的数组,用起来可方便了 ~

$
0
0

JS 原本的数组对异步调用太不友好了,比如不能这么做 const result = await arr.map(func),必须要在外面再套一层 await Promise.all(...),实在不够简洁、直观、优雅。不过如果用这个包 Prray代替数组的话,,就可以做到上面的效果了

import Prray from 'prray'
const prr = Prray.from(['www.google.com', 'npmjs.org'])

console.log(prr[0])    // www.google.com
console.log(prr.length)  // 2

const responses = await prr.mapAsync(fetch)

// 异步函数也能链状调用
const htmls = await prr.mapAsync(fetch).mapAsync(r => r.text())

// 普通函数和异步函数也能链状调用
await prr
  .map(commonFunc)
  .sortAsync(asyncFunc)
  .concat(['github.com', 'wikipedia.org'])
  .reverse()
  .splice(1, 2)
  .reduceAsync(asyncFunc2)

// 限制并发
const responses = await prr.mapAsync(fetch, { concurrency: 10 })
  • 黑科技异步方法也能链状调用
  • 和原来的数组完美兼容arr[ix]索引、...arr展开、for of循环……原来数组所有能做的都能做,可以直接用来替代数组。
  • 测试非常良好,不管是兼容性还是新方法,这个包的测试都非常充分: 不信你看
  • 性能优异(基于 native Promise)。如果不异步调用,方法们的性能和原生 Array 没有差别;如果异步调用,性能也就是手动使用 Promise 一样。
  • 非常轻量,没有其他三方依赖,打包后更小

github: https://github.com/Bin-Huang/prray


node.js ClusterClientNoResponseError

$
0
0

各位大佬: 生产服务有个定时任务一直在跑,cpu和内存突然100%,报这个错node.js ClusterClientNoResponseError,是因为cpu打满了才这样么? 日志: 2019-12-04 00:00:01,008 INFO 5814 [egg-logrotator] agent logger reload: got log-reload message 2019-12-04 19:38:32,225 ERROR 5814 nodejs.ClusterClientNoResponseError: client no response in 79756ms exceeding maxIdleTime 60000ms, maybe the connection is close on other side. at Timeout.Leader._heartbeatTimer.setInterval [as _onTimeout] (/home/dingding/hap-service/node_modules/cluster-client/lib/leader.js:77:23) at ontimeout (timers.js:498:11) at tryOnTimeout (timers.js:323:5) at Timer.listOnTimeout (timers.js:290:5) name: "ClusterClientNoResponseError" pid: 5814 hostname: wechat-f2

有试过 midway-faas 的小伙伴么

如何精准的修改/删除文件内的某一段字节

$
0
0

这个貌似是一个看起来简单,但实则是一个复杂的问题。

如果最简单的实现,就是读取字节,然后修改/删除,最后再重新写入文件,但是这样性能肯定很慢,而且文件有多大,就消耗多大的内存。不能保证原子的一致性。

So,请教各位有什么好的办法

例如文件 demo.txt, 删除/修改 hello对应的字节

hello world

Node+MongoDB+TypeScript 开发后端服务的一些实践

$
0
0

最近把这些年使用 Node 做后端服务的一些实践总结了一下,做成一个脚手架实例项目,名为 akajs

akajs 实际上是一些后端实践的集合,最初的想法是对公司的实际开发业务常用流程进行封装,减少重复开发。

现在开源出来,目的也不是为了提供一个 web 框架,只是想展示一下,在 Web 后端开发领域,我们是如何做的。

akajs 包括以下内容:

  • 模块化组织方式、系统较为复杂的时候需要
  • 注解式路由,类似 nest 或 Spring
  • ICO 依赖注入
  • 参数和返回值处理和错误处理
  • Mongoose 搭配 typescript + ioc
  • 注解式 Mongoose 事务
  • CRUD 一键生成
  • 日志和健康检查
  • 常用函数工具,如日期、数字等
  • 集成测试方案

详细内容请查看文档

mongodb在事务中更新了文档后如何在事务中就能查询出来

$
0
0

想请教一下各位,mongodb在事务中更新或删除了文档,如何通过find或findOne找到这些变更后的数据?我也知道只有事务最终提交了后文档才会真正更新到集合,但目前因为某些业务关系,需要在事务过程中就对变更的数据进行查询,能不能做到做这一点?我找了好多方法都不行,有了解的朋友麻烦指点一下谢谢

Koa系框架(egg/cabloy)如何获取微信支付回调请求中的xml参数

$
0
0

背景

在Koa系框架(如EggJS)中进行微信支付开发时,遇到一个问题:微信支付平台会发送一个回调请求,通知支付订单的处理结果。该请求传入的参数是xml格式,而Koa中间件koa-bodyparser对xml格式的请求参数没有做处理,这就需要我们在程序中自行处理

通用处理逻辑

网上通用的处理逻辑,都是类似如下的代码:

const bb = require('bluebird');

const xml = await bb.fromCallback(cb => {
  let data = '';
  this.ctx.req.setEncoding('utf8');
  this.ctx.req.on('data', function(chunk) {
    data += chunk;
  });
  this.ctx.req.on('end', function() {
    cb(null, data);
  });
});

分析与疑问

上面这段代码通过响应request对象的事件接收xml数据,对于微信支付这个场景简单有效,但是作为一个通用的xml处理机制,还是有所欠缺。request对象有如下事件:abortedclosedataenderror,此外,请求参数还有可能使用了压缩算法。如何对这些场景做更完整的处理呢?

借用中间件koa-bodyparser

由于Koa系框架(如EggJS)使用中间件koa-bodyparser对请求参数做预处理工作。那么最完整的处理逻辑也一定在中间件koa-bodyparser中。具体的源码这里不列出,可以参考如下链接:

通过分析中间件koa-bodyparser所引用的源码,我们就可以得到一个更简洁的xml处理代码,而且适应场景也更广,代码如下:

const raw = require('raw-body');
const inflate = require('inflation');

const xml = await raw(inflate(this.ctx.req));

CabloyJS的进一步封装

CabloyJS后端是基于EggJS定制的上层应用框架。CabloyJS通过向context对象注入一个通用的方法getPayload,那么在实际的开发场景中就更加方便了

注入方法

async getPayload(options) {
  return await raw(inflate(this.req), options);
}

实际调用

const xml = await this.ctx.getPayload();

【招聘】【新加坡】知名电商平台招聘开发/测试工程师

$
0
0

地点新加坡, 泛东南亚最大电商平台,知名团队,国际化平台,富有竞争的薪资,享受新加坡优质生活环境及教育资源,公司申请EP,属于技术引进性人才签证。可携带家人一起前往新加坡,配偶可在新加坡工作,子女可正常入托入学。视频面试。

目前招聘:前端工程师 | 后端工程师 | 测试工程师 | 平台开发工程师 运维开发工程师 | 全栈开发工程师| 服务器开发工程师 | 音视频算法工程师 | UI/UX 设计师

  • 月薪:3-6万人民币,新加坡税收很低,相比国内,同等工资实际到手多 20%,每年8%薪资增长。

  • 福利:公司提供 18 天年假,14 天带薪病假,6 天育儿假,14 天法定节假日,4 个月产假,无 996。工作时间灵活, work life balance;外出培训、线上培训均有补助;提供年度体检、商业保险(覆盖医疗、重疾、住院)

  • 办公环境:独栋公司大楼,提供高质量免费晚餐,无限零食饮料,设施完善的餐厅,休息室,午睡舱,健身房等,配备 herman miller aeron 座椅;

  • 英文:可看技术文档即可,团队多元化。

  • 要求:统招本科及以上,985,211 优先,大厂背景优先。

关于新加坡:全球最宜居国家之一;人力资本指数世界第一;花园城市,教育质量名列前矛,交通便利,医疗等社会福利保障系统健全,税率低,美食众多,经济发达。中国人容易适应,华人多,大多会说中英文。

关于我们( DADA Consultants ):本公司是位于新加坡的猎头公司,主要专注在互联网企业以及 IoT 行业的高精技术人才招聘。国外的月亮并没有特别圆,但是会很不一样,多一个机会多一种选择。

有意可发简历到: echo.tang@dadaconsultants.com; 或添加微信咨询,WeChat ID:Echo_TangXing


分享一个NODE开发的天气预报cli 工具

$
0
0

希望各位大佬提提意见,欢迎star

天气预报cli 工具

使用方法

npm i wci-cli-tool
weather -h 
weather -c 成都 -t -d 1 
weather -c 成都 -j -d 1 --hourly
weather -c 成都 -t -d 7 --hourly --date 11-11
weather -c 成都 -t -d 15
weather -c 成都 -t -d 40 
$ weather -c 成都 -t -d 1

**********实时天气预报实况**********

╔════════════════════╤══════════════╗
║ 属性               │ 数值         ║
╟────────────────────┼──────────────╢
║ 天气实况更新时间   │ 19:25        ║
╟────────────────────┼──────────────╢
║ 平均温度           │ 9°C          ║
╟────────────────────┼──────────────╢
║ 最高温度           │ 13°C         ║
╟────────────────────┼──────────────╢
║ 最低温蒂           │ 6°C          ║
╟────────────────────┼──────────────╢
║ 风力               │ 静风 0级     ║
╟────────────────────┼──────────────╢
║ 今日日落           │ 18:02        ║
╟────────────────────┼──────────────╢
║ 明日日出           │ 07:45        ║
╟────────────────────┼──────────────╢
║ 车辆限行           │ 3和8         ║
╟────────────────────┼──────────────╢
║ 发布天气预警       │ 暂无预警信息 ║
╟────────────────────┼──────────────╢
║ 空气质量           │ 87/良        ║
╟────────────────────┼──────────────╢
║ 空气相对湿度       │ 88%          ║
╟────────────────────┼──────────────╢
║ 能见度             │ 4.8km        ║
╟────────────────────┼──────────────╢
║ 气压               │ 974hpa       ║
╟────────────────────┼──────────────╢
║ 降雨量             │ 0.0mm        ║
╟────────────────────┼──────────────╢
║ 可吸入颗粒物(PM10) │ 98μg/m3      ║
╟────────────────────┼──────────────╢
║ 细颗粒物(PM2.5)    │ 64μg/m3      ║
╟────────────────────┼──────────────╢
║ 一氧化碳(CO)       │ 0.8mg/m3     ║
╟────────────────────┼──────────────╢
║ 二氧化氮(NO2)      │ 62μg/m3      ║
╟────────────────────┼──────────────╢
║ 二氧化硫(SO2)      │ 7μg/m3       ║
╟────────────────────┼──────────────╢
║ 紫外线             │ 最弱         ║
╟────────────────────┼──────────────╢
║ 减肥               │ 三颗星       ║
╟────────────────────┼──────────────╢
║ 血糖               │ 不易波动     ║
╟────────────────────┼──────────────╢
║ 穿衣指南           │ 厚毛衣       ║
╟────────────────────┼──────────────╢
║ 洗车               │ 适宜         ║
╟────────────────────┼──────────────╢
║ 空气污染扩散       │ 较差         ║
╚════════════════════╧══════════════╝

当天

未来7天

未来15天

未来40天

nestjs 微服务教程有没有

上传图片问题,报错如下

$
0
0

6F5FF0CB-7E40-4D51-B8C4-E346B5CAA0EE.png6D7E8817-7DA8-4158-B73C-9CDD30502F5C.png09689A84-322C-4353-AB29-45AADCE3F6CD.png那里写错了么 求大佬告诉 详细点- -

关于egg中加载器(Loader)问题

$
0
0

现在遇到一个需求,需要将数据库的配置文件放在 apollo 中进行管理,所以写了一个本地插件 egg-apollo 项目中进行异步获取配置,预计的想法是:

  1. 先执行 egg-apollo 插件,异步获取数据库配置
  2. 更新 this.config.sequelize 对象
  3. 初始 egg-sequelize 插件

但是现在无论把 egg-apollo 获取配置的方法写到loader哪个生命周期去,都无法阻止 egg-sequelize 比 egg-apollo 早执行,有啥有效的方法吗?

国内首家!360加入Ecma参与JavaScript语言标准制定

$
0
0

2019 年 6 月底,三六零安全科技股份有限公 司(以下简称 360)成为了国际标准组织 Ecma International 的会员,并加入了负责 JavaScript 语言标准制定的技术委员会 TC39 。这是 JavaScript 诞生 20 多年以来首次有中国公司的参与。在随后召开的 TC39 第 71 次技术会议上,360技术委员会 Web 前端分会委员贺师俊作为 360 的代表接手了function.sent提案的工作。这份提案早已达到第 2 阶段,但是提案的原负责人退休后,委员会里一直无人愿意接手,提案停滞多年,即将被撤销。这次360代表主动承担起该提案的工作,标志着中国已经正式参与到 JavaScript 语言标准的制定中。在 12 月举办的 Ecma 第 118 次会员大会上,360 代表也见证了阿里巴巴、华为和 Sujitech 等另外 3 家中国公司被批准为 Ecma 会员。

Ecma International 是一家国际性会员制度的信息和电信标准组织,总部位于瑞士日内瓦。成立四十年来,Ecma 制定了很多信息和电信技术标准。其中就包括 Web 开发领域最重要的编程语言 JavaScript 的标准:ECMAScript。此外,C#、Dart 和 CD-ROM 等数百项标准也是由 Ecma 制定的。Ecma 标准有大约三分之二同时被 ISO 批准为 ISO 标准。

JavaScript 是全球使用最为广泛的计算机编程开发语言之一,从网站到移动 App,从可穿戴设备到服务器,都能看到这门编程语言的身影。在GitHub 编程语言排行榜上,JavaScript 连续 6 年蝉联第一。全球互联网企业大都将 JavaScript 作为主要编程语言。

长期以来,JavaScript 标准规范的制定主要由国外会员公司主导。此次 360 参与 JavaScript 语言标准的制定,将会向世界传递来自中国开发者的声音。360非常重视行业标准的制定工作,除了 Ecma 之外,还参与了 W3C(万维网联盟)、国际电信联盟电信标准化部门(ITU)、中国通信标准化协会、信息安全标委会、汽车信息安全工作组等标准化组织的标准制定工作。

近年来,国内的很多 IT 企业已经从标准的追随者成为了标准制定者。360、阿里巴巴、华为和 SujiTech 等中国公司加入 Ecma 后,将共同参与ECMAScript 标准制定。与此同时,360 将与所有中国区 Ecma 会员一道,致力于成为国内 JavaScript 开发者与 Ecma 沟通的纽带和桥梁,让 Ecma 听到来自中国开发者的声音。假以时日,相信中国企业的加盟一定能给全球 JavaScript 社区带来新的气象和面貌,推动这门语言朝着更强大、更高效、更安全的方向发展。

Viewing all 14821 articles
Browse latest View live