npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@enhances/mock-server

v0.10.1

Published

mock 服务器, 开箱即用,无需重启,自动代理远程服务、提供静态web服务入口、零接入成本 扫描接口的数据生成到本地 json转js js转json 代理

Downloads

57

Readme

mock-server

mock 服务器, 开箱即用,无需重启,自动代理远程服务、提供静态web服务入口、零接入成本 零接入成本、一秒启动服务、 在非prod阶段减轻运维部署成本、 去除对后端服务依赖性 前端、测试可自定义伪接口,http请求或配合postman 等工具可以直接调试伪接口

功能总览

  1. mock 服务器, 开箱即用,读取本地mock文件、自动代理远程服务,本地直接返回mock服务的ip即可, 查询不到mock文件会自动代理请求proxyURL配置的线上(ip/域名)
  2. 提供对mock文件 增 、删、改、查功能
  3. 提供js、json mock 文件互相转换功能 (可以通过命令、已可以使用文档中的函数形式自定义转换)
  4. 启动命令时候添加配置 --scan 经过本mock服务器的接口都可以扫描接口的数据生成到本地
  • 小提示
    1. 已经兼容已测试过 node >= v14.21.3可以正常运行, 库开发使用 node v18.19.0 推荐 node >= 18.19.0
    2. 项目packages.json type 为 module 可能会导致不能正常运行,可是试着删除packages 中的type或者改成commonjs

下载

  • node
$ npm i @enhances/mock-server -D 或者 pnpm add @enhances/mock-server -D

命令

  1. mock 启动服务
  2. mock:5300 启动服务自定义服务端口
  3. jsToJson js文件转json文件
  4. jsonToJs json文件转js文件
  5. mock:scan 扫描接口的数据生成到本地 具体配置看 mock-config.js scan字段
{
    "scripts": {
        "mock": "enhances-mock start",
        "mock:scan": "enhances-mock start --scan true",
        "mock:5300": "enhances-mock start -p 5300",
        "jsToJson": " enhances-mock jsToJson -c 来源文件夹路径 -o 输出的文件夹路径",
        "jsonToJs": " enhances-mock jsonToJs -c 来源文件夹路径 -o 输出的文件夹路径"
    }
}

常用配置

  • mock-config.js
// 覆盖默认配置
const { MockServerJs } = require('@enhances/mock-server');
module.exports = {
    model: 'remote', // remote | local 强制使用本地(local)或者远程代理模式(remote)默认 auto
    proxyURL: {
        async format(api) {
            const url = MockServerJs.utils.defineProxy({
                '^/api': {
                    target: 'http://192.168.0.151:8888',
                    pathRewrite: {}
                }
            }, api);
            if (!/^http:|^https:/.test(url)) {
                // 这里判断处理没有匹配到接口
                return 'http://localhost' + url;
            }
            return url;
        }
    },
    staticServic: ['dist'],
    interceptors: {
        // 请求拦截
        async request(data) {
            return data;
        },
        // 响应拦截
        async response(data) {
            return data;
        }
    },
}

默认配置

const { MockServerJs } = require('@enhances/mock-server');
module.exports = {
    timeout: 300, // 延迟
    model: 'auto', // remote | local 强制使用本地(local)或者远程代理模式(remote)默认 auto
    // node-logger-plus 控制打印的配置
    loggerConfig: {
        log: true,
        debug: true,
        info: true,
        warn: true,
        error: true,
        table: true,
    },
    fileWithEnd: '.js', // mock 的文件 目前只兼容 js 文件, json 文件可以通过 jsonToJs 命令转换为 js
    mockSrc: '__mock__', // 读取mock的目录
     /**
     * @desc 启动命令时候添加配置 --scan 可以启动扫描线上接口生成到本地
     * @example 
     * enhances-mock start --scan true 
     */
    scan: {
        /**
         * @desc 最终输出的路径
         * @param {string} path 扫描的路径
         * @returns {string} 最终的输出路径
         * @default __mock__/.remotes/{扫描的路径}
         */
        outputChunk: function (url) {
            return path.join('__mock__', '.remotes', url)
        },
        /**
         * @desc 输出的文件格式 '.json' | '.js'
         * @default js
         */
        format: '.js',
    },
    logDir: '__mock__', // 打印日志保存的目录
    logFileName: 'log', // 日志文件名称
    logReplaceMaxSize: 1024 * 1024, // 日志最大的覆盖内容大小, 大于这个大小(Bytes)内容将会被覆盖
    staticServic: ['public'], // 在cwd下开放为静态服务目录
    proxyURL: {
        origin: 'https://xxxx/xxx.com', // 通过配置 proxyURL 代理请求线上
          async format(api) {
            const url = MockServerJs.utils.defineProxy({
                '^/api': {
                    target: this.origin,
                    pathRewrite: {
                        "/api": "/newApi"
                    }
                },
                '^/service/api': {
                    target: 'http://localhost:21412',
                    pathRewrite: {}
                }
            }, api);
            if(!/^http:|^https:/.test(url)) {
                // 这里判断处理没有匹配到接口
                return 'http://localhost' + url;
            }
            return url;
        }
    },
    interceptors: {
        // 请求拦截
        async request(data) {
            // 0.2.14版本后会有自动处理host delete data.headers.host; 操作
            return data;
        },
         // 响应拦截
        async response(data) {
            return data;
        }
    }
}

staticServic

  • 配置访问链接为例:http://localhost:60363/custom-public/index.js
  • 目录结构
    - mock-config.js
    - public
        -index.js
  • 配置文件
// `mock-config.js`
module.exports = {
     staticServic: [{
        suffix: '/custom-public',
        dir: 'public',
    }]
}

动态接口

  • 需要动态的文件固定写法: ${id}.js
  • 例如创建 mock 目录 __mock__/xxx/xxxx/${id}.js

例子

  • 接口: /education/getToken
  • 根据 mockSrc为 mock
  • 在运行根目录创建 mock 目录 __mock__/education/getToken.js
// getToken.js
exports.enabled = true; // true 代表使用本地mock false 使用代理
/**
 * @params {{ 'query': object, 'body': object, 'headers': object, '_parsedUrl': object }} req
 * @params {object} res
 */
exports.mock = (req, res) => {
    return {
        status: 200,
        message: 'mock'
    }
}

自定义响应体

exports.enabled = true;
exports.mock = (_, res) => {
    res.setHeader('content-disposition', 'filename="xxxxxx"') // 设置响应头
    .status(200) // 设置响应状态
    .send("响应的数据")  // 设置响应体
}
  • mock 提供的参数如下
/**
 * @params {{ 'query': object, 'body': object, 'headers': object, '_parsedUrl': object }} req exporess request
 * @params {object} res exporess response
 */
exports.mock(req, res): boolean;

编辑mock接口文件内容

目录结构

- __mock__
    - list.js
    - add.js
    - update.js
    - delete
        - ${id}.js
  • list.js
exports.enabled = true;
exports.mock = () => ({
    "errcode": 0,
    "errmsg": "ok",
    "data": {
        "records": [
            {
                id: '123',
                name: 'name123',
            }
        ],
    },
});

修改 list.js 为例

假如你要删除一个数据

  • 文件 delete/${id}.js
const { MockServerJs } = require('@enhances/mock-server');

exports.enabled = true;
exports.mock = async (req) => {
    const result = await MockServerJs.share.update(
        __dirname,
        '../list.js', // 现对路径
        (source) => {
            // source 这个是 list.js 页面 mock 函数返回的数据
            source.data.records = source.data.records.filter(record => record.id != req.query.id);
            // 返回数据会写入 list.js 的mock 函数里面
            return Promise.resolve(source)
        });
    return {
        errcode: 0,
        errmsg: 'ok',
        data: result,
    }
}

假如你要新增一条数据

  • 文件 add.js
const { MockServerJs } = require('@enhances/mock-server');

exports.enabled = true;
exports.mock = async (req) => {
    const result = await MockServerJs.share.update(
        __dirname,
        './list.js',  // 现对路径
        (source) => {
            // source 这个是 list.js 页面 mock 函数返回的数据
            source.data.records.push({
                id: Math.random() * 1000, // 随机生成一个id
                ...req.body, // 接口新增的参数
            });
            // 返回数据会写入 list.js 的mock 函数里面
            return Promise.resolve(source)
        });
    return {
        errcode: 0,
        errmsg: 'ok',
        data: result,
    }
}

假如你要编辑一条数据

  • 文件 update.js
const { MockServerJs } = require('@enhances/mock-server');

exports.enabled = true;
exports.mock = async (req) => {
    const result = await MockServerJs.share.update(
        __dirname,
        './list.js',  // 现对路径
        (source) => {
            // source 这个是 list.js 页面 mock 函数返回的数据
            source.data.records = source.data.records.map((record) => {
                if(req.body.id === record.id) {
                    return {
                        ...record,
                        ...req.body,
                    }
                }
                return record;
            })
            // 返回数据会写入 list.js 的mock 函数里面
            return Promise.resolve(source)
        });
    return {
        errcode: 0,
        errmsg: 'ok',
        data: result,
    }
}

通过函数对jsjson相互转换

  • jsjson
const { MockServerJs } = require('@enhances/mock-server');
MockServerJs.utils.jsToJson('来源文件夹路径', '输出的文件夹路径');
  • jsonjs
const { MockServerJs } = require('@enhances/mock-server');
MockServerJs.utils.jsonToJs('来源文件夹路径', '输出的文件夹路径');
  • jsonToJsjsToJson 第三个参数
const { MockServerJs } = require('@enhances/mock-server');
console.log(MockServerJs.utils.transformTemplates); // 默认的过滤模板。 通过对应类型的函数进行换行

MockServerJs.utils.jsonToJs('来源文件夹路径', '输出的文件夹路径', (data) => {
    // 自定义数据格式
    return data;
});

暴露的函数

  1. 获取本机ip getLocalIP
const { MockServerJs } = require('@enhances/mock-server');

MockServerJs.utils.getLocalIP(); // get local IP
  1. 打印彩色文本的函数 printInColor
  • 推荐使用最新库
  • https://www.npmjs.com/package/node-logger-plus
const { MockServerJs } = require('@enhances/mock-server');
// color 可选:reset red green yellow blue magenta cyan white
MockServerJs.utils.printInColor([{ color: 'green', text: 'text' } ]);
// 或者使用
MockServerJs.utils.logger2.success('Mock server config file changed update options end');
  1. 编辑mock文件 MockServerJs.share.update
  • 看上面编辑mock文件的例子

维护它