Browse Source

添加资源文件下载

master
sunshine 11 months ago
parent
commit
59fe024dca
  1. 42
      app.js
  2. 50
      config/log.js
  3. 207
      modules/auto/AutoUpdateSdkMain.js
  4. 16
      modules/auto/MaterialAutoUpdate.js
  5. 124
      package-lock.json
  6. 1
      package.json
  7. 21
      utils/DownloadFile.js

42
app.js

@ -2,6 +2,8 @@ const Koa = require('koa');
const app = new Koa();
require('console-color-mr'); //颜色模块
const koaBody = require('koa-body'); //处理post请求参数
const fs = require('fs');
app.use(koaBody({
multipart: true, // 支持文件上传
}));
@ -17,21 +19,39 @@ app.use(json());
// 捕获错误logger 记录
const logsUtil = require('./utils/LogUtil');
// 错误处理中间件(注意:这不会捕获由 Koa 抛出的 'error' 事件)
app.use(async (ctx, next) => {
try {
await next();
// 如果 Koa 没有找到任何路由来处理请求,它将自动设置 ctx.status 为 404
if (ctx.status === 404) {
ctx.status = 404;
ctx.body = {
error: 'Not Found',
code: 404,
message: 'The requested resource could not be found.'
};
}
} catch (err) {
// 这里捕获在路由处理函数中抛出的错误
logsUtil.logError(ctx, err);
ctx.status = 500;
ctx.body = {
error: 'Internal Server Error',
code: 500,
message: 'An unexpected error occurred on the server.'
};
}
});
// 捕获未被处理的错误(如异步错误或中间件外的错误)
app.on('error', (err, ctx) => {
logsUtil.logError(ctx, err);
// 注意:此时响应可能已经被发送到客户端,所以你不能修改 ctx.body 或 ctx.status
// 你可以在这里做其他清理工作,比如关闭数据库连接等
});
// 捕获全局请求不存在的接口返回404
app.use(async (ctx, next) => {
await next();
if (parseInt(ctx.status) === 404) {
ctx.response.status = 404;
ctx.body = '404'
} else if (parseInt(ctx.status) === 500) {
ctx.response.status = 500;
ctx.body = "500"
}
})
// 启动服务器
const port = 3000;

50
config/log.js

@ -46,36 +46,36 @@ let errorLogPath = baselogPath + errorPath + '/' + errorFileName;
"path": errorPath,
compress:true
},
"resLogger": {
"type": "dateFile",
"filename": responseLogPath,
"pattern": "yyyy-MM-dd.log",
"alwaysIncludePattern": true,
"encoding": "utf-8",
"maxLogSize": 52428800,
"numBackups": 3,
"path": responsePath,
compress:true
},
"handleLogger": {
"type": "dateFile",
"filename": handleLogPath,
"pattern": "yyyy-MM-dd.log",
"alwaysIncludePattern": true,
"encoding": "utf-8",
"maxLogSize": 52428800,
"numBackups": 3,
"path": responsePath,
compress:true
},
// "resLogger": {
// "type": "dateFile",
// "filename": responseLogPath,
// "pattern": "yyyy-MM-dd.log",
// "alwaysIncludePattern": true,
// "encoding": "utf-8",
// "maxLogSize": 52428800,
// "numBackups": 3,
// "path": responsePath,
// compress:true
// },
// "handleLogger": {
// "type": "dateFile",
// "filename": handleLogPath,
// "pattern": "yyyy-MM-dd.log",
// "alwaysIncludePattern": true,
// "encoding": "utf-8",
// "maxLogSize": 52428800,
// "numBackups": 3,
// "path": responsePath,
// compress:true
// },
},
//供外部调用的名称和对应设置定义
categories: {
"default": {"appenders": ["rule-console"], "level": "all"},
"resLogger": {"appenders": ["resLogger"], "level": "info"},
// "resLogger": {"appenders": ["resLogger"], "level": "info"},
"errorLogger": {"appenders": ["errorLogger"], "level": "error"},
"handleLogger": {"appenders": ["handleLogger"], "level": "all"},
"http": {"appenders": ["resLogger"], "level": "info"}
// "handleLogger": {"appenders": ["handleLogger"], "level": "all"},
// "http": {"appenders": ["resLogger"], "level": "info"}
},
"baseLogPath": baselogPath
}

207
modules/auto/AutoUpdateSdkMain.js

@ -0,0 +1,207 @@
const ut = require("../sdk/ts/sdk-unittest-node.js");
const comd = require("../sdk/ts/common-data-node.js");
const fs = require("fs");
const path = require("path");
// 读取json文件
function readJsonFile(pathStr) {
let detail = fs.readFileSync(pathStr, "utf8");
detail = JSON.parse(detail);
return detail;
}
/** 读取物料详情 */
function readMatDetail(reqR, id, inParam) {
const relatDetail = readJsonFile(path.join(reqR.detailDir, id + ".json"));
inParam.setMatDetail(id, relatDetail);
}
/** 读取素材详情 */
function readDetail(reqR, id, inParam) {
const relatDetail = readJsonFile(path.join(reqR.detailDir, id + ".json"));
inParam.setDetail(id, relatDetail);
if (!inParam.hasBin(relatDetail.materialType)) {
inParam.makeContent(relatDetail);
return;
}
const relatPth = path.join(reqR.binDir, id + ".bin");
const relatBin = fs.readFileSync(relatPth);
const r = inParam.setBin(relatBin, relatDetail);
for (const mid of r) {
readDetail(reqR, mid, inParam);
}
}
function saveFile(doa, reqR) {
// 修改详情信息
const newDetail = doa.detail;
newDetail.binFileUrl = reqR.newReceiveMaterialId + ".bin";
newDetail.materialId = reqR.newReceiveMaterialId;
const newDetailStr = JSON.stringify(newDetail, "", "\t");
const newReceiveFullPath = path.join(reqR.detailDir, reqR.newReceiveMaterialId + ".json");
fs.writeFileSync(newReceiveFullPath, newDetailStr);
// 新生成的bin
const newReceiveBinFullPath = path.join(reqR.binDir, reqR.newReceiveMaterialId + ".bin");
fs.writeFileSync(newReceiveBinFullPath, doa.bin);
}
function readAttr(dir, inParam, isAttr) {
const attrD = readJsonFile(dir);
for (const iterator of attrD) {
inParam.tvoM.createFTVByData(iterator, isAttr);
}
}
function readExtends(reqR, inParam) {
const attrD = readJsonFile(reqR.extendDir);
inParam.extendsRuleM.initAttrMap(attrD);
}
function readParam(reqR, inParam) {
const fns = fs.readdirSync(reqR.paramDir);
fns.forEach(fileName => {
const filedir = path.join(reqR.paramDir, fileName);
const stats = fs.statSync(filedir);
if (stats.isFile()) {
const fn = path.parse(filedir).name;
const paramDetail = readJsonFile(filedir);
inParam.setParamDetail(fn, paramDetail);
}
});
}
/** 初始化参数 */
function initParam(reqR) {
const inParam = new ut.model_unittest.DSdkInArgv();
inParam.reveiveId = reqR.receiveMaterialId;
inParam.req = reqR;
readParam(reqR, inParam);
readDetail(reqR, inParam.reveiveId, inParam);
readAttr(reqR.attrDir, inParam, true);
readAttr(reqR.categoryDir, inParam, false);
readExtends(reqR, inParam);
return inParam;
}
// 推送素材
function pushMaterial(reqR) {
const inParam = initParam(reqR);
inParam.pushId = reqR.pushMaterialId;
inParam.pushIds = reqR.pushMaterialIdList;
for (const pid of inParam.pushIds) {
readDetail(reqR, pid, inParam);
}
if (reqR.materialRelationParamVOList != null) {
for (const rpvo of reqR.materialRelationParamVOList) {
if (inParam.checkIsMat(rpvo.paramType)) {
readMatDetail(reqR, rpvo.paramDefaultValue, inParam);
}
else if (inParam.checkIsStyle(rpvo.paramType)) {
readDetail(reqR, rpvo.paramDefaultValue, inParam);
}
}
}
if (reqR.relationMaterialIdList != null) {
for (let index = 0; index < reqR.relationMaterialIdList.length; index++) {
const element = reqR.relationMaterialIdList[index];
readDetail(reqR, element, inParam)
}
}
const etd = new ut.model_unittest.UpdateAuto(inParam.decoder);
let doa = etd.startPushMaterial(inParam);
if (doa == null) {
doa = createDefDoa(inParam);
}
saveFile(doa, reqR);
}
function createDefDoa(inParam) {
const bin = inParam.getBin(inParam.reveiveId);
const detail = inParam.getDetail(inParam.reveiveId);
return { detail, bin }
}
function handleDir(reqR, workDir) {
if (workDir != null) {
reqR.binDir = workDir + reqR.binDir;
reqR.detailDir = workDir + reqR.detailDir;
reqR.paramDir = workDir + reqR.paramDir;
reqR.reqFileUrl = workDir + reqR.reqFileUrl;
reqR.resFileUrl = workDir + reqR.resFileUrl;
reqR.attrDir = workDir + reqR.attrDir;
reqR.categoryDir = workDir + reqR.categoryDir;
reqR.extendDir = workDir + reqR.extendDir;
}
}
function doPush(reqR, workDir = "") {
console.time("doPush")
comd.model_d.UClassTree.rootModule = comd.model_d.UClassTree.getNodeJsRootModule(module);
// setTimeout(()=>{
handleDir(reqR, workDir);
if (reqR.materialRelationParamVOList != null) {
for (const o of reqR.materialRelationParamVOList) {
o.paramDefaultValue = o.paramDefaultValueVersion;
}
}
pushMaterial(reqR);
console.timeEnd("doPush")
// },1000)
}
function tryReadReq(reqR, workDir = "") {
let isSuccess = true;
let code = 200;
let msg = "来自node的回复";
try {
doPush(reqR, workDir);
} catch (error) {
isSuccess = false;
msg = error;
code = -1
}
writeRes(reqR.resFileUrl, code, msg, isSuccess);
}
function writeRes(pathStr, code, msg, isSuccess) {
const resD = {
"code": code,
"data": {},
"msg": msg.stack,
"success": isSuccess
}
const resDStr = JSON.stringify(resD, "", "\t")
fs.writeFileSync(pathStr, resDStr)
}
function readArgv(reqPath) {
// const reqPath = process.argv[2];
const reqR = readJsonFile(reqPath);
tryReadReq(reqR);
}
function localRun(reqPath) {
// 项目工程地址
console.log('当前文件根目录:', __dirname)
console.log('当前文件根目录:', path.join(`${__dirname}/data/material_auto/upload/20240513143213139802/req/0297505113_62.json`))
const p = path.join(`${__dirname}/data/material_auto/upload/20240513143213139802/req/0297505113_62.json`); //
// const reqR = readJsonFile(resolve('./sdk/data/material_auto/upload/20240513143213139802/req/0297505113_62.json'));
const reqR = readJsonFile(p);
// tryReadReq(reqR, __dirname);
doPush(reqR, __dirname);
}
// readArgv()
// localRun()
const autoUpdate = module.exports = {
localRun: localRun,
readArgvs: readArgv
};

16
modules/auto/MaterialAutoUpdate.js

@ -1,12 +1,18 @@
const autoUpdate = require ("../sdk/ts/autoUpdateMain");
const autoUpdate = require ("./AutoUpdateSdkMain");
const path = require("path");
const fs = require("fs");
const axios = require('axios');
const downloadFile = require("../../utils/DownloadFile");
//推送素材更新方法
const pushMaterial = async (ctx, next) => {
console.log('ctx', ctx.query);
console.log(ctx.query.req);
//线上执行更新
autoUpdate.readArgv(ctx.query.req);
const buffer = await downloadFile.downloadFileToBuffer("https://7z-data.oss-cn-shenzhen.aliyuncs.com/render/custom/09/82/6052742231/h6j0lixqyk9niq8.bin");
console.log("buffer", buffer);
fs.writeFileSync('./yyyyyyyy.bin', buffer);
const req = ctx.query.req;
console.log('req', req);
autoUpdate.readArgvs(req);
};
const materialAutoUpdate = module.exports = {

124
package-lock.json

@ -1,14 +1,15 @@
{
"name": "oa",
"name": "design_node_koa",
"version": "1.0.0",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "oa",
"name": "design_node_koa",
"version": "1.0.0",
"license": "ISC",
"dependencies": {
"axios": "^1.7.0",
"koa": "^2.13.0",
"koa-body": "^4.2.0",
"koa-helmet": "^6.0.0",
@ -139,6 +140,21 @@
"node": ">= 8"
}
},
"node_modules/asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
"integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
},
"node_modules/axios": {
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.7.0.tgz",
"integrity": "sha512-IiB0wQeKyPRdsFVhBgIo31FbzOyf2M6wYl7/NVutFwFBRMiAbjNiydJIHKeLmPugF4kJLfA1uWZ82Is2QzqqFA==",
"dependencies": {
"follow-redirects": "^1.15.6",
"form-data": "^4.0.0",
"proxy-from-env": "^1.1.0"
}
},
"node_modules/balanced-match": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
@ -379,6 +395,17 @@
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
},
"node_modules/combined-stream": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
"dependencies": {
"delayed-stream": "~1.0.0"
},
"engines": {
"node": ">= 0.8"
}
},
"node_modules/concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
@ -512,6 +539,14 @@
"resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz",
"integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ=="
},
"node_modules/delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
"integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
"engines": {
"node": ">=0.4.0"
}
},
"node_modules/delegates": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
@ -601,6 +636,38 @@
"resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz",
"integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA=="
},
"node_modules/follow-redirects": {
"version": "1.15.6",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz",
"integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==",
"funding": [
{
"type": "individual",
"url": "https://github.com/sponsors/RubenVerborgh"
}
],
"engines": {
"node": ">=4.0"
},
"peerDependenciesMeta": {
"debug": {
"optional": true
}
}
},
"node_modules/form-data": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
"integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
"dependencies": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.8",
"mime-types": "^2.1.12"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/formidable": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.2.tgz",
@ -1462,6 +1529,11 @@
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
"integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
},
"node_modules/proxy-from-env": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
"integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
},
"node_modules/pstree.remy": {
"version": "1.1.8",
"resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz",
@ -2108,6 +2180,21 @@
"picomatch": "^2.0.4"
}
},
"asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
"integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
},
"axios": {
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.7.0.tgz",
"integrity": "sha512-IiB0wQeKyPRdsFVhBgIo31FbzOyf2M6wYl7/NVutFwFBRMiAbjNiydJIHKeLmPugF4kJLfA1uWZ82Is2QzqqFA==",
"requires": {
"follow-redirects": "^1.15.6",
"form-data": "^4.0.0",
"proxy-from-env": "^1.1.0"
}
},
"balanced-match": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
@ -2289,6 +2376,14 @@
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
},
"combined-stream": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
"requires": {
"delayed-stream": "~1.0.0"
}
},
"concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
@ -2393,6 +2488,11 @@
"resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz",
"integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ=="
},
"delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
"integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="
},
"delegates": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
@ -2467,6 +2567,21 @@
"resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz",
"integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA=="
},
"follow-redirects": {
"version": "1.15.6",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz",
"integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA=="
},
"form-data": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
"integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
"requires": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.8",
"mime-types": "^2.1.12"
}
},
"formidable": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.2.tgz",
@ -3120,6 +3235,11 @@
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
"integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
},
"proxy-from-env": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
"integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
},
"pstree.remy": {
"version": "1.1.8",
"resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz",

1
package.json

@ -10,6 +10,7 @@
"author": "",
"license": "ISC",
"dependencies": {
"axios": "^1.7.0",
"koa": "^2.13.0",
"koa-body": "^4.2.0",
"koa-helmet": "^6.0.0",

21
utils/DownloadFile.js

@ -0,0 +1,21 @@
const axios = require('axios');
//下载资源文件流
async function downloadFileToBuffer(url) {
try {
// 发起 GET 请求并设置 responseType 为 'arraybuffer'
const response = await axios({
method: 'get',
url,
responseType: 'arraybuffer'
});
console.log("数据流", response.data);
return response.data;
} catch (error) {
throw new Error(`Error downloading file from ${url}: ${error.message}`);
}
}
module.exports = {
downloadFileToBuffer: downloadFileToBuffer
}
Loading…
Cancel
Save