通过node.js的request模块调用企业微信第三方接口
业务场景:博主做了一个前台为企业微信应用,后台为web端管理系统的项目,因此组织结构和用户结构等都要与企业微信同步,所以前端调用接口后不仅需要写入数据库还要同步到企业微信,也就有了在后端调用企业微信接口的这一步骤
以下代码不包括连接数据库,创建数据库实体类等操作
技术栈:node.js+express+mongDB
//routes/index.js
const service = require("../service/index")//引入处于业务逻辑的文件
app.post("/admin/api/addDepartment", async ( req, res) => {
let data = await service.insertDepartment(req.body)
if(data.code == 0){
res.json( {code:200,msg:"添加部门成功",data})
}else{
res.json( {code:200,msg:"数据库添加成功",data})
}
})
//service/index.js
const rq = require("request-promise")//引入node的request-promise模块
const Counter = require("../../models/Counter")//引入计数模块
const Department = require("../../models/Department")//引入部门模块
const inserDepartment = async (data) =>{
/*
以下这一段代码是因为mongDB没有自动实现自增序列的方法,所以根据网上查阅的资料写了出来
但目前每次获取到的结果都是+2之后的结果,等我日后更新修复这个bug
*/
//获取自增序列的值
const counterResult = await Counter.findOneAndUpdate(
{ _id: 'departmentId' },
{ $inc: { seq_val: 1 } },
{new: true},
(err, doc) => {
if(err) {return {msg : "获取自增ID失败",err :err }}
return doc
}
)
//给数据库部门ID赋值
data.departmentId = counterResult.seq_val +""
//写入数据库
const insertObj = await new Department(data)
const resultData = await insertObj.save()
.then( async res => {
//这里处理企业微信需要的数据
let wxData = {
name: res.departmentName,//企业微信部门中文名
id: res.departmentId, //企业微信部门ID
order: res.order,//企业微信部门排序值
parentid: res.parentId//企业微信父级部门ID
}
//调用企业微信第三方接口
const requestResult = await rq({
//请求路径
url: "https://qyapi.weixin.qq.com/cgi-bin/department/create?access_token=" +access_token,
//请求方法
method: 'POST',
//自动解析响应中的JSON字符串
json: true,
//请求头
headers:{
"content-type": "application/json"
},
//请求体
body: wxData
})
.then( res => {
console.log(`请求返回的数据::${JSON.stringify(res)}`)
return res
})
.catch( err => {
console.log(`请求错误的数据: ${JSON.stringify(error)}`)
return err
})
console.log("企业微信接口返回了吗")
return requestResult
})
//简单处理一下企业微信返回的数据
if(resultData.errcode == 0){
return {
code: 0,
data: resultData
}
}else{
return {
code: 1,
data: resultData
}
}
}
总结:
这次的小demo最大的阻碍其实是执行顺序的问题,在前期过程中原本是用的是node中的request模块但是总会在接口数据都已经返回了,企业微信的回调函数才运行,因此在阅读了官方文档后发现还有request-promise的模块,果断采用了,就不会出现很奇怪的执行顺序
细心的朋友应该发现了有很多result的变量,这个主要是为了解决return的时候总是undefimed的问题.
最后
这是博主第一次写接口,有写的不对的地方,或者不够简洁的地方,希望老哥们多多提出,感谢~
mongoose官方文档:http://www.mongoosejs.net/docs/api.html#Model
request-promise官方文档: https://github.com/request/request-promise
企业微信官方文档:https://work.weixin.qq.com/api/doc/90000/90135/90205