如何在 Sails.js 中生成唯一的发票 ID

Posted

技术标签:

【中文标题】如何在 Sails.js 中生成唯一的发票 ID【英文标题】:How to generate a unique invoice id in Sails.js 【发布时间】:2016-08-22 08:43:26 【问题描述】:

我需要让 Sails 使用当前格式为我的发票生成一个唯一 ID:

 <auto-incremented-number>/<current-year>

点赞:8/2016122/2099122/2100

我们的想法是按照文档中的示例进行操作

 function getLatestId() 
   //stuck here
   return 42;
 

 const current_year = new Date().getFullYear()
 const calculated_id = getLatestId() +"/"+ current_year

 Invoice.create( data:'...', id: calculated_id ).exec(function (err, item)
   if (err)  return res.serverError(err); 

   sails.log('Invoice created:', item.id);
   return res.ok();
 );

问题是,即使有一个有效的getLatestId 函数,代码也很丑陋,而且它的代码闻起来很臭。

即使尝试在 create 函数的 exec 回调中更新 id 看起来也很奇怪,因为已经创建了具有特定 id 的项目。

我不敢相信sails 没有解决类似情况的方法,但我在文档中也找不到任何内容。

【问题讨论】:

【参考方案1】:

1.你需要检查这个生成的ID是否存在

2.在node下使用crypt生成uID

const crypto = require('crypto');
const uID = crypto.randomBytes(2).toString('hex');

例子:

'use strict';
const crypto = require('crypto');

function generateID(callback) 
  let uID = crypto.randomBytes(2).toString('hex'); //eg.uID = 3d4f
  let current_year = new Date().getFullYear();
  let uID = uID +"/"+ current_year;

  Invoice.findOne(id: uID).exec(function(err, invoice) 
    if(err) 
      //catch Error
     else 
      if(invoice) 
        // nope... uID exist
        return generateID(callback);
       else 
        return callback(uID)
      
    
  );


generateID(function (uID) 
  Invoice.create( data:'...', id: uID ).exec(function (err, item) 
    if (err) 
      // return res.serverError(err);  <-- It's bad idea sending whole err to client. It's may expose your app architecture
      sails.log.error(err);
      return res.serverError(errCode: 001, message: '<Your custom message>');
     else 
      sails.log('Invoice created:', item.id);
      // return res.ok(); <-- It's OK, but if u use new version of sailsJS you should have created response (201). You can see code in responses/created.js
      return res.created();
    

  );
);

这里有一些其他的随机生成方法:https://blog.tompawlak.org/generate-random-values-nodejs-javascript

【讨论】:

从技术上讲,ID 必须是连续的,但我明白你的方法

以上是关于如何在 Sails.js 中生成唯一的发票 ID的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Python 中生成唯一 ID? [复制]

如何在javascript中生成唯一ID? [复制]

如何在本机反应中生成唯一ID

如何在 Postgres 9.6+ 中生成长度为 N 的随机、唯一的字母数字 ID?

在 php 中生成唯一 id(用于 url 缩短器)

分布式系统中生成全局ID的总结与思考