2020-08-27 17:18:57 +08:00

128 lines
3.9 KiB
JavaScript

const Mock = require('mockjs');
const faker = require('faker');
const path = require('path');
const fs = require('fs');
const logger = require('morgan');
const multer = require('multer');
const bodyParser = require('body-parser');
const onFinished = require('on-finished');
const util = require('./util');
const cgiMock = require('./cgiMock');
const log = require('./log');
const main = {
init(app, argv, cwd) {
this.app = app;
this.argv = argv;
this.cwd = cwd;
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
extended: false
}));
const upload = multer();
app.post('/upload', upload.single('upFiles'), (req, res, next) => {
// req.file 是 `avatar` 文件的信息
// req.body 将具有文本域数据,如果存在的话
console.log(req.file);
console.log(req.body);
res.send(JSON.stringify({
code: '0',
msg: 'this is message',
result: {
url: ''
}
}));
});
this.customRoute();
this.defaultRoute();
},
customRoute() {
const argv = this.argv;
let defaultCgiMockFile = '';
const home = process.env[process.platform === 'win32' ? 'USERPROFILE' : 'HOME'];
defaultCgiMockFile = path.join(process.cwd(), '/mock.js');
let cgiMockFile;
if (argv) {
if (argv.f) {
if (process.platform === 'win32') {
cgiMockFile = path.resolve(this.cwd, this.argv.f);
} else if (argv.f[0] === '~') {
cgiMockFile = path.resolve(home, argv.f.replace(/^~\//, ''));
} else {
cgiMockFile = path.resolve(this.cwd, this.argv.f);
}
} else {
cgiMockFile = defaultCgiMockFile;
}
} else {
cgiMockFile = defaultCgiMockFile;
}
global.cgiMockFilePath = path.resolve(cgiMockFile, '..');
const loadRouteConfig = function () {
util.cleanCache(cgiMockFile);
try {
if (!fs.existsSync(cgiMockFile)) {
log.error('[WARN] 不存在mock.js文件');
} else if (util.isFunction(require(cgiMockFile))) {
global.router.stack = [];
require(cgiMockFile)(cgiMock, Mock, faker);
log.message('[SUCCESS] mock.js 加载成功');
} else {
log.error(`[ERROR] mock.js cannot be ${typeof (require(cgiMockFile))}`);
}
} catch (e) {
log.error('[ERROR] mock.js 有误,请检查');
log.error(JSON.stringify(e));
}
};
loadRouteConfig();
this.app.use(cgiMock.prefix, (req, res, next) => {
// var mockContent = require(cgiMockFile);
onFinished(res, (err, res) => {
// console.log(mockContent.toString());
loadRouteConfig();
});
global.router(req, res, next);
});
util.watchFile(cgiMockFile, () => {
log.message('[INFO] mock/app.js 发生变化');
loadRouteConfig();
log.message('[SUCCESS] mock/app.js UPDATED!');
});
},
defaultRoute() {
const app = this.app;
setTimeout(() => {
// app.use(function (req, res, next) {
// var err = new Error('Not Found');
// err.status = 404;
// next(err);
// });
app.use((err, req, res, next) => {
res.json({
status: err.status || 500,
message: err.message,
err
});
});
});
}
};
module.exports = main.init.bind(main);