winney

It is never too old to learn.

0%
winney

设置关键词自动回复

微信公众号后台设置

生成公众号二维码

生成二维码

获取开发者密码

获取开发者密码

接口配置

接口配置

客户端-微信服务器-开发者服务器

客户端-微信服务器-开发者服务器

设置白名单

设置白名单

app.js

1
2
3
4
5
6
7
8
//uselNewUrlParser这个属性会在url里识别验证用户所需的db,未升级前是不需要指定的,升级到一定要指定。
mongoose.connect('mongodb://127.0.0.1:27017/egecms',{ useNewUrlParser: true },function(err){
if(err){
console.log(err);
return;
}
console.log( '数据库连接成功")
);
1
2
3
4
5
6
7
8
9
10
// 定义数据表(集合的)映射︰注意。字段名称必须和数据库保持一致
var UserSchema=mongoose.Schema({
name:String,
age:Number,
status:{
type:Number,
default:1
}
})
// 定义model操作数据库

user.js

1
2
3
4
5
6
7
8
9
10
var mongoose = require('./db.js');
var UserSchema=mongoose.Schema({
name:String,
age:Number,
status:{
type:Number,
default:1
}
})
module.exports=mongoose.model( "User", UserSchema, "user');

app.js

1
2
3
4
5
6
7
8
9
var UserModel=require("./model/user.js");

UserModel.find({},function(err,docs){
if(err){
console.log(err);
return;
}
console.log(docs);
})

news.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var mongoose=require('./db.js');

var NewsSchema=mongoose.Schema({
title:{
type:String,
trim:true //定义 mongoose模式修饰符去掉空格
},
author: String,
pic:String,
content:String,
status:{
type:Number,
default:1
}
})

module.exports=mongoose.model('News',NewsSchema, 'news');

app.js

1
2
3
4
5
6
console.time('user');
var UserModel=require("./model/user.js");
console.timeEnd('user');
console.time('news');
var NewsModel=require('./model/news.js');
console.timeEnd('news');

Mongoose预定义模式修饰符Getters与Setters自定义修饰符

一、mongoose预定义模式修饰符

lowercase、uppercase 、 trim

mongoose提供的预定义模式修饰符,可以对我们增加的数据进行一些格式化。

二、Mongoose Getters 与Setters自定义修饰符

除了mongoose内置的修饰符以外,我们还可以通过set(建议使用)修饰符在增加数据的时候对数据进行格式化。也可以通过get(不建议使用)在实例获取数据的时候对数据进行

Mongoose索引、Mongoose内置CURD方法、扩展Mongoose Model的静态方法和实例方法

一、Mongoose索引

二、Mongoose内置CURD

Mongoose数据校验

一、Mongoose校验参数

  • required :表示这个数据必须传入
  • max用于Number类型数据,最大值
  • min:用于Number类型数据,最小值
  • enum:枚举类型,要求数据必须满足枚举值enum: ['0','1','2']
  • match:增加的数据必须符合match(正则)的规则
  • maxlength:最大值
  • minlength:最小值

Mongoose中使用aggregate聚合管道

将多个js文件合并成一个js文件的同时,不进行压缩

1
2
3
4
5
6
7
8
9
10
11
12
const path = require("path");

module.exports = {
entry: "./src/wanka/index.js", // 入口文件
output: {
path: path.resolve(__dirname, "dist"),
filename: "bundle.js", // 输出的文件名
},
mode: 'development',
devtool: 'source-map' // 设置为生成source map
};

import 动态导入

根据当前渠道,打包对应的SDK

common.js

1
export const pack_platform = 'hongg';   // 打包渠道名称

hongg/hongg.js

1
2
3
export class MYWXSDK {

}

./script/index.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import { pack_platform } from './common'

class JMMiddleSDK {
...
// 初始化参数
init(initData, callback) {
....

// 根据渠道,动态引入对应的SDK
import(/* webpackIgnore: true */`../src/${pack_platform}/${pack_platform}.js`).then(module => {
const { MYWXSDK } = module;
// 使用 WXSDK 进行后续操作
console.log('MYWXSDK');
console.log(MYWXSDK);
this.platform = this.initData.platform;
this.wxsdk = new MYWXSDK(init);
this.wxsdk.init(init, callback);
}).catch(err => {
console.error('报错:', err);
});
}

重点:要在import路径参数前加/* webpackIgnore: true */参数,不然会遍历当前路径下的全部

相对路径../src/, 以dist为当前路径设置的

每次打包前,只要修改common.js需要打包的渠道名称

动态导入要使用then:

1
2
3
4
5
import().then(module => {
// module的使用
}).catch(err => {
console.error('报错:', err);
});

以上方法存在一个问题:当渠道sdk的js文件(hongg/hongg.js)中有引入第三方包时,如:import HgSdk from './HgSdk.min.js';,则打包时第三方的代码没有被打包进去

根据不同渠道,动态打包方法一

  1. 渠道sdk代码

    1
    2
    3
    export class MYWXSDK {

    }

    每个渠道的class命名要一样,都是MYWXSDK(自定义为一样)

  2. ./src/scripts/index.js

    1
    import { JMSDK } from './import';
  3. package.json

    1
    2
    3
    "scripts": {
    "build": "cross-env CHANNEL=hongg webpack",
    }

    打包时,运行npm run build命令; 打包不同渠道,就将CHANNEL的值改为对应的渠道名

  4. webpack.config.js ——定义环境变量 CHANNEL

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    const webpack = require('webpack');

    module.exports = {
    // 定义环境变量 CHANNEL
    plugins: [
    new webpack.DefinePlugin({
    'process.env.CHANNEL': JSON.stringify(process.env.CHANNEL)
    })
    ],
    };

    使用的时:process.env.CHANNEL即可拿到CHANNEL的值

  5. webpack.config.js——动态生成import.js

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    const fs = require('fs');

    /**
    * 创建渠道importJs文件
    * @param {*} importJsPath
    * @param {*} processEnv
    */
    function createImportJs(importJsPath, processEnv) {
    const classPath = `../${processEnv.CHANNEL}/${processEnv.CHANNEL}.js`;
    const createImportJsContent = "import { MYWXSDK } from '" + classPath + "'; export function JMSDK(init) {return new MYWXSDK (init);}";

    fs.writeFile(importJsPath, createImportJsContent, 'utf8', (err) => {
    if (err) {
    console.error("import.js文件写入失败, 原因:" + err);
    } else {
    console.log('import.js文件写入成功');
    }
    });
    }
    const importJsPath = './src/scripts/import.js';
    createImportJs(importJsPath, process.env)

    在打包前,webpack入口文件index.js中引入的import.js已写入成功:

    1
    import { MYWXSDK } from '../hongg/hongg.js'; export function JMSDK(init) {return new MYWXSDK (init);}
  6. 打包命令

    1
    npm run build
优化打包方法1
  1. package.json

    1
    "build": "cross-env CHANNEL=$npm_config_channel webpack",
  2. webpack.config.js

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    module.exports = (env, argv) => {
    return{
    // 定义环境变量 CHANNEL————方法二
    plugins: [
    new webpack.DefinePlugin({
    // 可以在命令行中使用 --channel 参数来指定渠道 npm run build --channel=hongg
    'process.env.CHANNEL': JSON.stringify(argv.channel || process.env.CHANNEL)
    })
    ],
    }
    };
  3. 打包命令——直接在这里指定渠道名,不需要修改package.json里的build命令中的CHANNEL

    1
    npm run build --channel=hongg
优化打包方法2

不需要在package.json中添加命令

  1. webpack.config.js

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    // 方法二
    const webpack = require('webpack');
    const fs = require('fs');
    /**
    * 创建渠道importJs文件
    * @param {*} importJsPath
    * @param {*} channel 渠道名称
    */
    function createImportJs(importJsPath, channel) {
    const classPath = `../${channel}/${channel}.js`;
    const createImportJsContent = "import { MYWXSDK } from '" + classPath + "'; export function JMSDK(init) {return new MYWXSDK (init);}";

    fs.writeFile(importJsPath, createImportJsContent, 'utf8', (err) => {
    if (err) {
    console.error("import.js文件写入失败, 原因:" + err);
    } else {
    console.log('import.js文件写入成功');
    }
    });
    }

    // webpakc打包配置
    module.exports = (env, argv) => {
    const importJsPath = './src/scripts/import.js';
    createImportJs(importJsPath, env.channel);

    return{
    // 定义环境变量 CHANNEL————方法二
    plugins: [
    new webpack.DefinePlugin({
    // 可以在命令行中使用 --channel 参数来指定渠道 webpack --env channel=hongg
    'process.env.CHANNEL': JSON.stringify(env.channel || process.env.CHANNEL)
    })
    ],
    }
    };

根据不用渠道,动态打包方法二

  1. ./src/scripts/index.js

    1
    import { JMSDK } from './import';
  2. script/handleSp.js

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    const fs = require('fs');

    module.exports = {
    /**
    * 创建渠道importJs文件
    * @param {*} importJsPath
    * @param {*} processEnvEnviroment
    */
    createImportJs: function (importJsPath, processEnvEnviroment) {
    const params = processEnvEnviroment.split('-');
    const className = params[0];
    const classPath = params[1];
    const createImportJsContent = "import { " + className + " } from '" + classPath + "'; export function JMSDK(init) {return new " + className + "(init);}";

    fs.writeFile(importJsPath, createImportJsContent, 'utf8', (err) => {
    if (err) {
    console.error("import.js文件写入失败, 原因:" + err);
    } else {
    console.log('import.js文件写入成功');
    }
    });
    }
    };
  3. webpack.config.js

    1
    2
    3
    4
    5
    // 处理自动渠道打包逻辑,生成import.js文件
    const hangleSp = require('./src/scripts/handleSp.js');
    const importJsPath = './src/scripts/import.js';
    const processEnvEnviroment = process.env.ENVIRONMENT;
    hangleSp.createImportJs(importJsPath, processEnvEnviroment);
  4. package.json

    1
    2
    3
    4
    5
    6
    7
    8
    "scripts": {
    "zidou": "cross-env ENVIRONMENT=ZDWXSDK-../zidou/zidou npx webpack --stats-error-details",
    "feiqu": "cross-env ENVIRONMENT=FQWXSDK-../feiqu/feiqu npx webpack --stats-error-details",
    "slang": "cross-env ENVIRONMENT=SLWXSDK-../slang/slang npx webpack --stats-error-details",
    "lewan": "cross-env ENVIRONMENT=LWWXSDK-../lewan/lewan npx webpack --stats-error-details",
    "vxiny": "cross-env ENVIRONMENT=XYWXSDK-../vxiny/vxiny npx webpack --stats-error-details",
    "zhwan": "cross-env ENVIRONMENT=ZWWXSDK-../zhwan/zhwan npx webpack --stats-error-details",
    }

    每次新增渠道,要新增命令, 每个渠道的sdk名称可不一样

  5. 打包命令

    1
    npm run zidou		// npm run 渠道名称