2016-08-22 62 views
0

一个唯一的发票编号我需要帆为我的发票与当前格式的唯一ID:如何产生Sails.js

<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的项目已经创建。

我不敢相信,风帆没有东西来解决类似的情况,但我无法找到文档中的任何东西。

回答

1

1.You需要检查,如果此生成的ID存在

2.To生成下节点使用加密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

+0

从技术上说,身份证必须是连续的,但我得到你的方法 – Motocarota