mock-service-plugin
Version:
Simulated backend interface service
78 lines (75 loc) • 2.17 kB
JavaScript
import Mock from 'mockjs';
import { stringify } from 'csv-stringify/sync';
import fs from 'fs';
// src/response/csv-handler.ts
var BaseResponseHandler = class {
constructor(options = {}) {
this.options = options;
}
/**
* 设置响应头
* @param {Response} res - 响应对象
* @param {string} contentType - 内容类型
*/
setHeaders(res, contentType) {
res.set("Content-Type", contentType);
res.set("Access-Control-Allow-Origin", "*");
res.set("Access-Control-Allow-Methods", "GET,HEAD,PUT,POST,DELETE,PATCH");
}
/**
* 处理文件响应
* @param {string} filePath - 文件路径
* @returns {Promise<Buffer>}
*/
async readFile(filePath) {
return new Promise((resolve, reject) => {
fs.readFile(filePath, (err, data) => {
if (err) reject(err);
else resolve(data);
});
});
}
/**
* 处理错误
* @param {Response} res - 响应对象
* @param {Error} error - 错误对象
*/
handleError(res, error) {
console.error(`[Response Error] ${error.message}`);
res.status(500).json({
error: "Internal Server Error",
message: error.message
});
}
};
// src/response/csv-handler.ts
var CsvResponseHandler = class extends BaseResponseHandler {
async handle(req, res, route) {
try {
this.setHeaders(res, "text/csv");
const responseTemplate = typeof route.responseTemplate === "string" ? JSON.parse(route.responseTemplate) : route.responseTemplate;
const mockData = Mock.mock(responseTemplate);
const dataArray = Array.isArray(mockData) ? mockData : [mockData];
const csv = stringify(dataArray, {
header: true,
columns: this.getColumns(dataArray[0])
});
res.send(csv);
} catch (error) {
this.handleError(
res,
error instanceof Error ? error : new Error(String(error))
);
}
}
getColumns(data) {
if (!data) return {};
return Object.keys(data).reduce((acc, key) => {
acc[key] = key;
return acc;
}, {});
}
};
export { CsvResponseHandler };
//# sourceMappingURL=csv-handler.js.map
//# sourceMappingURL=csv-handler.js.map