目录
5、在server/utils/目录下创建sandbox.js文件,内容如下:
docker run -itd --name yapiMongo -p 27017:27017 -v /etc/localtime:/etc/localtime -v /root/yapi/mongoData/:/data/db mongo:latest
mongodb(2.6+)
use admin
db.createUser(
{
user:'admin',
pwd :'',
customData:{"desc":"This user is for administrators"},
roles:[
{
role:'userAdminAnyDatabase',db:'admin'
}
]
}
)
use yapi
db.createUser(
{
user:'yapi',
pwd :'',
customData:{"desc":"This user is for administrators"},
roles:[
{
role:'readWrite',db:'yapi'
}
]
}
)
nodejs(7.6+)
curl -o yapi.zip https://codeload.github.com/YMFE/yapi/zip/refs/heads/master
yapi(1.10+)
npm i safeify --save
server/utils/
目录下创建sandbox.js
文件,内容如下:const Safeify = require('safeify').default;
module.exports = async function sandboxFn(context, script) {
// 创建 safeify 实例
const safeVm = new Safeify({
timeout: 3000,
asyncTimeout: 60000,
// quantity: 4, //沙箱进程数量,默认同 CPU 核数
// memoryQuota: 500, //沙箱最大能使用的内存(单位 m),默认 500m
// cpuQuota: 0.5,
// true为不受CPU限制,以解决Docker启动问题
unrestricted: true,
unsafe: {
modules: {
// 引入assert断言库
assert: 'assert'
}
}
});
safeVm.preset('const assert = require("assert");');
script += "; return this;";
// 执行动态代码
const result = await safeVm.run(script, context);
// 释放资源
safeVm.destroy();
return result
};
{
"port": "3000",
"adminAccount": "admin@admin.com",
"timeout":120000,
"db": {
"servername": "127.0.0.1",
"DATABASE": "yapi",
"port": 27017,
"user": "yapi",
"pass": "yapi",
"authSource": ""
},
"mail": {
"enable": true,
"host": "smtp.163.com",
"port": 465,
"from": "***@163.com",
"auth": {
"user": "***@163.com",
"pass": "*****"
}
}
}
npm install --production --registry https://registry.npm.taobao.org
npm run install-server //安装程序会初始化数据库索引和管理员账号,管理员账号名可在 config.json 配置
node server/app.js //启动服务器后,请访问 127.0.0.1:{config.json配置的端口},初次运行会有个编译的过程,请耐心等候
mirrors / YMFE / yapi · GitCode
问题说明
MockJson脚本调用报错:Error: Cannot read property 'delay' of undefined
在sandbox.js中添加script += "; return this;";,只有脚本中带return语句,变量result才能获得返回值。
在镜像中启动服务报错:Error: EROFS: read-only file system, mkdir '/sys/fs/cgroup/cpu/safeify'
这是safeify为了限定CPU资源使用,需要在此路径下写入文件,但是在镜像中此路径为只读路径,在 new Safeify对象时设置unrestricted: true,即可。
断言功能不可用,assert.equal is not a function
safeify对于执行脚本中库的引入方式与之前不同,需要通过unsafe来实现,具体可以看上面的sandbox.js的实现。
测试集合中log对象无效
测试集合中在断言失败的情况下,使用log来进行调试,但是接入safeify之后,log功能有点问题,后续更新解决办法,可以先关注一下。
assert严格模式,Cannot convert object to primitive value
在之前的assert.equal({}, '')是可以通过的,引入safeify后会报错,但是问题不大,最好还是按照严格模式来写。