在很多行业很多项目,比如电商,比如金融,比如O2O等,在用户注册这一块会经常用到手机号。如何判断一个手机号是否存在?在特殊产品需求条件下,我们需要区分用户的运营商(移动、联通、电信),甚至区分用户省份,乃至城市,来方便产品,运营同学对用户进行地区化,个性化服务。为了解决这样的业务、产品需求,就动手写了这个模块。
[query]: 查询手机号详细信息, 异步函数
可选参数option说明
/**
*option = > {
parallel:2,//插件通道并发请求数,默认是2,当为0时使用最大(所有可用插件)并发数同时发起查询请求。
timeout:null,//响应超时时间
model:0,//获取手机号码信息模式,目前支持3种:0->只获取手机号运营商,1->获取手机号运营商以及省份,2->获取手机号运营商、省份以及城市(地级市)
plugins:[]//指定使用哪些插件通道(当某些通道出问题时,用户可以指定只用这些通道)
}
*/
查询手机号运营商
var phoneService = require('phone-service');
var option = {};
phoneService.query(15900000000,option,function(err,data){
//data=>{supplier:"**移动",phone:15900000000,abbreviation:'China_Mobile'}
});
// promise
phoneService.query(15900000000,option)
.then(function (data) {
//data=>{supplier:"**移动",phone:15900000000,abbreviation:'China_Mobile'}
})
查询手机号运营商以及省份
var phoneService = require('phone-service');
var option = {model:1};
phoneService.query(15900000000,option,function(err,data){
//data=>{supplier:"**移动",province:'广东',phone:15900000000,abbreviation:'China_Mobile'}
});
查询手机号运营商、省份以及城市(地级市)
var phoneService = require('phone-service');
var option = {model:2};
phoneService.query(15900000000,option,function(err,data){
//data=>{supplier:"**移动",province:'广东',city:'中山',phone:15900000000,abbreviation:'China_Mobile'}
});
var phoneService = require('phone-service');
phoneService.isPhone(15900000000) === true
var phoneService = require('phone-service');
phoneService.isChinaMobile(15900000000) === true
var phoneService = require('phone-service');
phoneService.isChinaTelecom(15900000000) === false;
var phoneService = require('phone-service');
phoneService.isChinaUnicom(15900000000) === false;
如果模块自带的插件不满足或者被插件对应的平台屏蔽了,使用者可以自己开发插件来完成工作。
//插件开发 demo
var phoneService = require('phone-service');
var util = phoneService.util;
var plugin = phoneService.plugin;//插件对象
var pluginMock = {
name:'navy',//插件名字
parse:function(phone,cb){
//数据解析,返回json.当所编写的插件:
//1.只返回手机号服务商(即插件的model定义为0)时,返回的对象中必须包含key:util.getSupplierKey()
//2.返回手机号服务商和归属省份(即插件的model定义为1)时,返回的对象中必须包含key:util.getSupplierKey(),util.getProvinceKey()
//3.返回手机号服务商和归属省份以及归属城市(即插件的model定义为2)时,返回的对象中必须包含key:util.getSupplierKey(),util.getProvinceKey(),util.getCityKey()
var result = {};
result[util.getSupplierKey()] = '移动';
result[util.getProvinceKey()] = '广东';
result[util.getCityKey()] = '广州';
cb(null,result);
}
model:2,//model可取值:0,1,2,说明请看上面parse函数
url:function(phone){
return 'http://xxxx.com?phone='+phone;//返回请求的url
},
option:{
//node request module request method param.
headers:{"User-Agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/41.0.2272.76 Chrome/41.0.2272.76 Safari/537.36"},
encoding:null
}
};
plugin.add(pluginMock);//注册插件
plugin.check('navy',function(err,data){
if(!err){
//plugin is ok;
}
})
//使用刚才注册的插件
phoneService.query(15900000000,{plugins:['navy']},function(err,data){
//todo
})
当模块自带的插件或者使用者自己开发的插件出问题时(比如被插件对应的平台屏蔽),这时候在调用api前可以卸载有问题的模块
plugin.delete('navy');//卸载自己写的插件
plugin.delete('360');//卸载模块自带的插件
//调用query方式时将不再使用360插件了
phoneService.query(15900000000,function(err,data){
//todo
})
var phoneService = require('phone-service');
phoneService.util.getSupplierKey();//获取服务商返回的key
phoneService.util.getProvinceKey();//获取省份返回的key
phoneService.util.getCityKey();//获取城市(地级市)返回的key
//test
npm test
//code coverage
//npm run cov
=============================== Coverage summary ===============================
Statements : 87.41% ( 354/405 )
Branches : 80.83% ( 156/193 )
Functions : 95.95% ( 71/74 )
Lines : 87.41% ( 354/405 )
================================================================================
发布logs
- 4.0.0 query api 支持promise方式调用
- 3.0.1 添加parallel参数为0时开启最大(当前支持插件)并发数同时发起查询请求
- 3.0.0 修复重大的bug,plugin下try catch 没有return。建议立马升级至3.0.0。