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服务的更多相关文章

  1. gRPC初探——概念介绍以及如何构建一个简单的gRPC服务

    目录 引言 1. gRPC简介 2. 使用Protocol Buffers进行服务定义 2.1 定义消息 2.2 定义服务接口 3.构建简单的gRPC服务 3.1 编写proto文件,定义消息和接口 ...

  2. 构建一个在线ASCII视频流服务

    构建一个在线ASCII视频流服务 2018-03-26  正常的文章 1685 什么是ASCII视频流服务? 其实这个名字是咱胡乱起的,具体叫啥我也不清楚,但效果如下: 大家可以在自己的命令行里试下, ...

  3. php的源代码包构建一个空的php扩展。

    下载一个php的源代码包,这里使用的是php 4.0.5版,解压后会看到php的根目录下会有README.EXT_SKEL这样一个文件,打开详细阅读了一下,发现了一个非常好用的工具,这个工具可以帮你构 ...

  4. 学习构建一个简单的wcf服务

    入门,构建第一个WCF程序 1.服务端 建立一个控制台应用程序作为Server,新建一个接口IData作为服务契约.这个契约接口一会儿也要放到Client端,这样双方才能遵循相同的标准.别忘了添加对 ...

  5. [计算机视觉]从零开始构建一个微软how-old.net服务/面部属性识别

    大概两三年前微软发布了一个基于Cognitive Service API的how-old.net网站,用户可以上传一张包含人脸的照片,后台通过调用深度学习算法可以预测照片中的人脸.年龄以及性别,然后将 ...

  6. 从零开始写一个npm包及上传

    最近刚好自己需要写公有npm包及上传,虽然百度上资料都能找到,但是都是比较零零碎碎的,个人就来整理下,如何从零开始写一个npm包及上传. 该篇文件只记录一个大概的流程,一些细节没有记录. tips:  ...

  7. (转)前端开发-发布一个NPM包之最简单易懂流程

    原文地址:https://www.cnblogs.com/sghy/p/6829747.html 1.npm官网创建npm账户 npm网站地址:https://www.npmjs.com/ npm网站 ...

  8. 创建并发布npm包

    1.npm官网创建npm账户 npm网站地址:https://www.npmjs.com/ npm网站注册地址:https://www.npmjs.com/signup 2.命令行工具登录npm np ...

  9. Knative 实战:三步走!基于 Knative Serverless 技术实现一个短网址服务

    短网址顾名思义就是使用比较短的网址代替很长的网址.维基百科上面的解释是这样的: 短网址又称网址缩短.缩短网址.URL 缩短等,指的是一种互联网上的技术与服务,此服务可以提供一个非常短小的 URL 以代 ...

随机推荐

  1. java,string和list,list和set相互转换

    list转string String str= String.join("','", list); list转set Set<String> set = new Has ...

  2. jQuery.form 上传文件

    今年大部分是都在完善产品,这几天遇到了一个问题,原来的flash组件不支持苹果浏览器,需要改.在网上搜了下,看到一个jQuery.form插件可以上传文件,并且兼容性很好,主要浏览器大部分都兼容,插件 ...

  3. ASP.NET Core中使用MialKit实现邮件发送

    # 导包 首先我们需要导入 MailKit NuGet包,NuGet安装包命令在下方拓展介绍中. # 引用命名空间 using MailKit.Net.Smtp; using MimeKit; # 邮 ...

  4. 03 .NET CORE 2.2 使用OCELOT -- Docker中的Consul

    部署consul-docker镜像 先搜索consul的docker镜像 docker search consul 然后选择了第一个,也就是官方镜像 下载镜像 docker pull consul 然 ...

  5. 我是如何一步步编码完成万仓网ERP系统的(十二)库存 1.概述

    https://www.cnblogs.com/smh188/p/11533668.html(我是如何一步步编码完成万仓网ERP系统的(一)系统架构) https://www.cnblogs.com/ ...

  6. Jquery ajax与asp.net MVC前后端各种交互

    1.Jquery通过ajaxSubmit提交表单 if (jQuery("#Edit_from").validate().form()) { jQuery("#Edit_ ...

  7. Flask应用启动流程

    目录 flask应用启动流程 WSGI 启动流程 flask应用启动流程 WSGI 所有的 python web 框架都要遵循 WSGI 协议 在这里还是要简单回顾一下 WSGI 的核心概念. WSG ...

  8. 在组件上使用v-model

    (1) 等价于: 其中$event.target.value表示获取输入框的值. (2)当用在组件上时,v-model 则会这样: 其中$event表示$emit抛出的值,即$emit的第二个参数. ...

  9. android studio学习----创建模拟器

    建议在创建模拟器前把 SDK Manager 中的 Tools.Extras 都更新到最新. 如何弹出下面的各个图,首先直接点击  运行  然后会选择  launcher ,点击那个 ...就出来了 ...

  10. Markdown随笔

    Markdown随笔 这两天兴致来了,想尝试一下使用 Markdown. 写这篇博客时我用的是: MarkdownPad 2 关于 MarkdownPad 2 的安装破解网上有很多教程了,这里我就不赘 ...