yapi/server/middleware/mockServer.js

63 lines
2.1 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import yapi from '../yapi.js';
import projectModel from '../models/project.js'
import interfaceModel from '../models/interface.js'
import Mock from 'mockjs'
module.exports = async (ctx, next) => {
yapi.commons.log('mock Server running...')
let hostname = ctx.hostname;
let config = yapi.WEBCONFIG;
if(ctx.hostname === config.webhost){
if(next) await next();
return true;
}
let projectInst = yapi.getInst(projectModel), projects;
try{
projects = await projectInst.getByDomain(hostname);
}catch(e){
return ctx.body = yapi.commons.resReturn(null, 403, e.message);
}
let matchProject = false, maxBasepath = 0;
for(let i=0, l = projects.length; i< l; i++){
let project = projects[i];
if(ctx.path && ctx.path.indexOf(project.basepath) === 0 && project.basepath[project.basepath.length -1] === '/'){
matchProject.push(project);
if(project.basepath.length > maxBasepath){
maxBasepath = project.basepath.length;
matchProject = project;
}
}
}
if(matchProject === false){
return ctx.body = yapi.commons.resReturn(null, 400, '不存在的domain');
}
let project = matchProject, interfaceData;
let interfaceInst = yapi.getInst(interfaceModel);
try{
interfaceData = await interfaceInst.getByPath(project._id, ctx.path.substr(project.basepath.length));
if(!interfaceData || interfaceData.length === 0){
return ctx.body = yapi.commons.resReturn(null, 404, '不存在的api');
}
if(interfaceData.length > 1){
return ctx.body = yapi.commons.resReturn(null, 405, '存在多个api请检查数据库');
}
interfaceData = interfaceData[0];
if(interfaceData.res_body_type === 'json'){
return ctx.body = Mock.mock(
yapi.commons.json_parse(interfaceData.res_body)
);
}
return ctx.body = interfaceData.res_body;
}catch(e){
return ctx.body = yapi.commons.resReturn(null, 409, e.message);
}
}