使用plv8+ shortid npm包构建一个短唯一id服务
plv8 是一个很强大的pg 扩展插件,我们可以直接额使用js 增强sql ,shortid 是一个用来生成短连接id 很方便的类库
因为shortid 是一个npm 模块,我们需要使用一种方法使用require 的方式引用包,这个我们可以通过 plv8 node 模块解决
以下是一个简单的demo
使用plv8 node 模块注册shortid 原理
使用plv8 node 模块主要是方便快速的生成plv8 pg 插件可使用的npm 包(包含依赖的处理,基于browserify的处理)
原理实际上比较简单,主要包含以下
- 生成包含依赖的js
browserify +bable node api
- require 的钩子
基于plv8 提供的plv8.start_proc,同时我们通过数据级别的session 配置简单应用端连接需要的set 执行
参考如下:
ALTER DATABASE postgres SET "plv8.start_proc" TO "v8.plv8_init";
- 基于plv8 创建 调用shortid 的函数
内容如下:
CREATE or replace FUNCTION shortid() RETURNS text AS
$$
const shortid = require('shortid');
const result = shortid.generate();
return result;
$$
LANGUAGE plv8;
注册shortid demo
- package.json
{
"name": "node-plv8",
"version": "1.0.0",
"main": "app.js",
"bin": "app.js",
"license": "MIT",
"dependencies": {
"cuid": "^2.1.6",
"knex": "^0.20.1",
"lodash": "^4.17.15",
"pg": "^7.12.1",
"plv8": "^2.1.4",
"shortid": "^2.2.15",
"uuid": "^3.3.3"
},
"scripts": {
"init:app": "node app"
}
}
- 调用plv8 npm 模块实现npm包注册
// setup plv8 connection
const PLV8 = require('plv8')
const knex = require('knex')
const knexHandle = knex({
client: 'pg',
connection: {
host: "127.0.0.1",
user: "postgres",
password: "dalong",
database: "postgres"
}
})
const plv8 = new PLV8(knexHandle)
// setup a log listener
plv8.on('log:error', msg => {
console.error(msg)
})
plv8.install({modulePath:require.resolve("shortid"),moduleName:"shortid"})
.then(() => {
// eval some code
return plv8.eval(() => {
const shortid = require('shortid')
return shortid.generate()
})
})
.then(result => {
console.log(result)
}).catch(err=>{
console.log(err)
})
短连接服务模型
为了演示,模型比较简单,主要是一个自增id 以及shortid 的存储,shortid 的生成通过调用
我们创建的函数shortid
- 数据库表
CREATE TABLE shortids (
id integer DEFAULT nextval('shorids_id_seq'::regclass) PRIMARY KEY,
shortid text
);
-- Indices -------------------------------------------------------
CREATE UNIQUE INDEX shorids_pkey ON shortids(id int4_ops);
- 插入操作
insert into shortids(shortid) values(shortid());
- 数据效果

说明
从shortid 的算法上,随机性比较高的,一般的猜测比较难,我们通过plv8 以及强大的js能力,很方便的就可以设计一个灵活的短连接服务
参考资料
http://knexjs.org/#Installation-pooling
https://github.com/langateam/node-plv8
https://github.com/plv8/plv8
https://github.com/dylang/shortid
https://github.com/rongfengliang/plv8-require-learning
使用plv8+ shortid npm包构建一个短唯一id服务的更多相关文章
- gRPC初探——概念介绍以及如何构建一个简单的gRPC服务
目录 引言 1. gRPC简介 2. 使用Protocol Buffers进行服务定义 2.1 定义消息 2.2 定义服务接口 3.构建简单的gRPC服务 3.1 编写proto文件,定义消息和接口 ...
- 构建一个在线ASCII视频流服务
构建一个在线ASCII视频流服务 2018-03-26 正常的文章 1685 什么是ASCII视频流服务? 其实这个名字是咱胡乱起的,具体叫啥我也不清楚,但效果如下: 大家可以在自己的命令行里试下, ...
- php的源代码包构建一个空的php扩展。
下载一个php的源代码包,这里使用的是php 4.0.5版,解压后会看到php的根目录下会有README.EXT_SKEL这样一个文件,打开详细阅读了一下,发现了一个非常好用的工具,这个工具可以帮你构 ...
- 学习构建一个简单的wcf服务
入门,构建第一个WCF程序 1.服务端 建立一个控制台应用程序作为Server,新建一个接口IData作为服务契约.这个契约接口一会儿也要放到Client端,这样双方才能遵循相同的标准.别忘了添加对 ...
- [计算机视觉]从零开始构建一个微软how-old.net服务/面部属性识别
大概两三年前微软发布了一个基于Cognitive Service API的how-old.net网站,用户可以上传一张包含人脸的照片,后台通过调用深度学习算法可以预测照片中的人脸.年龄以及性别,然后将 ...
- 从零开始写一个npm包及上传
最近刚好自己需要写公有npm包及上传,虽然百度上资料都能找到,但是都是比较零零碎碎的,个人就来整理下,如何从零开始写一个npm包及上传. 该篇文件只记录一个大概的流程,一些细节没有记录. tips: ...
- (转)前端开发-发布一个NPM包之最简单易懂流程
原文地址:https://www.cnblogs.com/sghy/p/6829747.html 1.npm官网创建npm账户 npm网站地址:https://www.npmjs.com/ npm网站 ...
- 创建并发布npm包
1.npm官网创建npm账户 npm网站地址:https://www.npmjs.com/ npm网站注册地址:https://www.npmjs.com/signup 2.命令行工具登录npm np ...
- Knative 实战:三步走!基于 Knative Serverless 技术实现一个短网址服务
短网址顾名思义就是使用比较短的网址代替很长的网址.维基百科上面的解释是这样的: 短网址又称网址缩短.缩短网址.URL 缩短等,指的是一种互联网上的技术与服务,此服务可以提供一个非常短小的 URL 以代 ...
随机推荐
- talk about string,char
[1].关于sprintf和snprintf的正确使用 考虑以下有缺陷的例子:void f(const char *p){ char buf[11]={0}; sprintf(buf,"%1 ...
- 一文搞定所有 web 自动化常见问题
Firefox 1. Firefox路径问题 firefox火狐浏览器去完成自动化测试时,代码报了如下错误: Cannot find firefox binary in PATH. mark sure ...
- SWIG 3 中文手册——5. SWIG 基础知识
目录 5 SWIG 基础知识 5.1 运行 SWIG 5.1.1 输入格式 5.1.2 SWIG 输出 5.1.3 注释 5.1.4 C 预处理器 5.1.5 SWIG 指令 5.1.6 解析限制 5 ...
- ArrayList 源码分析 基于jdk1.8:
1:数据结构: transient Object[] elementData; //说明内部维护的数据结构是一个Object[] 数组 成员属性: private static final int ...
- c++小学期大作业攻略(零)建议+代码结构(持续更新)
当前已经做好的exe,数据库是连服务器的,但是头像是存在本地的文件系统里面: https://cloud.tsinghua.edu.cn/d/059ef6b1f9a149ce879b/files/?p ...
- 部门工资前三高的所有员工 - LeetCode
Employee 表包含所有员工信息,每个员工有其对应的工号 Id,姓名 Name,工资 Salary 和部门编号 DepartmentId . +----+-------+--------+---- ...
- __attribute__((format(printf, a, b)))
最近,在看libevent源码,第一次看到__attribute__((format(printf, a, b)))这种写法.因此,在这里记录下用法. 功能:__attribute__ format属 ...
- 基础知识---const、readonly、static
const:静态常量,也称编译时常量(compile-time constants),属于类型级,通过类名直接访问,被所有对象共享! a.叫编译时常量的原因是它编译时会将其替换为所对应的值: b.静态 ...
- C#环境配置
由于C#是,Net框架的一部分,且用于编写.Net应用程序,所以我们需先了解下C#与.Net框架之间的关系. .Net框架(.Net Framework) .Net框架是一个创新的平台,能帮你编写出下 ...
- 线程之间灵活传递信号(ManualResetEventSlim )
当主程序启动时,首先创建ManualResetEventSlim 类的一个实例.然后启动三个线程,等待事件信号通知它们继续执行. /// <summary> /// 创建 ManualRe ...