|
|
// 导入 request 模块,该模块常用于在 Node.js 中发起 HTTP 请求,方便与其他网络服务进行交互
|
|
|
const request = require('request');
|
|
|
|
|
|
// 自动匹配运单号所属的物流公司
|
|
|
function autoComNumber(orderno) {
|
|
|
// 构造请求的 URL,向快递100的接口发送请求,尝试自动匹配运单号对应的物流公司
|
|
|
// 将运单号拼接到 URL 参数中,resultv2=1 可能是用于指定返回结果的某种格式或版本相关参数
|
|
|
const url = `https://www.kuaidi100.com/autonumber/autoComNum?resultv2=1&text=${orderno}`;
|
|
|
// 返回一个 Promise 对象,用于处理异步操作,使得外部可以使用 async/await 语法来等待该函数执行完成
|
|
|
return new Promise(function (resolve, reject) {
|
|
|
// 使用 request 模块发起 GET 请求,传入 URL 和回调函数,回调函数接收请求过程中的错误、响应对象以及响应体内容作为参数
|
|
|
request(url, (err, response, body) => {
|
|
|
// 如果请求过程中出现错误,调用 reject 函数拒绝这个 Promise,并返回包含状态码 500 和错误信息的对象
|
|
|
if (err) return reject({ status: 500, msg: err.message });
|
|
|
// 将响应体内容(通常是 JSON 字符串格式)解析为 JavaScript 对象,方便后续提取数据
|
|
|
body = JSON.parse(body);
|
|
|
// 如果解析后的 body.auto 数组长度小于等于 0,意味着没有匹配到对应的物流公司,同样调用 reject 函数拒绝 Promise,并返回相应的错误信息对象
|
|
|
if (body.auto.length <= 0) return reject({ status: 501, msg: '无对应的物流公司' });
|
|
|
// 如果匹配到了物流公司,调用 resolve 函数成功解决这个 Promise,返回包含状态码 200、物流公司信息以及对应的公司编码的对象
|
|
|
resolve({ status: 200, msg: body.auto[0], comCode: body.auto[0].comCode });
|
|
|
});
|
|
|
});
|
|
|
}
|
|
|
|
|
|
// 定义一个异步函数,用于获取物流信息,接收 Express 框架的请求(req)和响应(res)对象作为参数(从函数名和使用方式推测可能在 Express 应用中使用)
|
|
|
async function getLogisticsInfo(req, res) {
|
|
|
// 调用 autoComNumber 函数,传入请求参数中的运单号(req.params.orderno),并使用 await 等待该异步操作完成,获取匹配物流公司后的结果
|
|
|
const result = await autoComNumber(req.params.orderno);
|
|
|
|
|
|
// 如果返回结果的状态码不是 200,说明匹配物流公司出现问题,直接返回一个包含错误状态和相应错误消息的对象给客户端
|
|
|
if (result.status!== 200) {
|
|
|
return {
|
|
|
meta: {
|
|
|
status: 500,
|
|
|
message: '获取物流信息失败!'
|
|
|
}
|
|
|
};
|
|
|
}
|
|
|
|
|
|
// 根据匹配到的物流公司编码和运单号构造查询物流信息的 URL,向快递100的另一个接口发送请求以获取详细物流信息
|
|
|
const dataUrl = `https://www.kuaidi100.com/query?type=${result.comCode}&postid=${req.params.orderno}&temp=0.2595247267684455`;
|
|
|
// 使用 request 模块发起请求,传入构造好的 URL 和回调函数,处理获取物流信息过程中的各种情况
|
|
|
request(dataUrl, (err, response, body) => {
|
|
|
// 如果请求过程中出现错误,使用 Express 的 res.send 方法向客户端发送包含错误状态和相应错误消息的对象,表示获取物流信息失败
|
|
|
if (err) {
|
|
|
return res.send({
|
|
|
meta: {
|
|
|
status: 501,
|
|
|
message: '获取物流信息失败!'
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
// 如果请求成功,解析响应体内容(假设为 JSON 格式),提取其中的物流信息数据(.data 属性,具体格式取决于快递100接口返回的数据结构),
|
|
|
// 然后使用 Express 的 res.send 方法向客户端发送包含成功状态、相应消息以及物流信息数据的对象,表示获取物流信息成功
|
|
|
return res.send({
|
|
|
meta: {
|
|
|
status: 200,
|
|
|
message: '获取物流信息成功!'
|
|
|
},
|
|
|
data: (JSON.parse(body)).data
|
|
|
});
|
|
|
});
|
|
|
}
|
|
|
|
|
|
// 将 getLogisticsInfo 函数作为模块的属性导出,方便其他模块引入并使用这个函数来获取物流信息
|
|
|
module.exports = {
|
|
|
getLogisticsInfo
|
|
|
}; |