wechat,wechat-api,mongoose,winston等的使用

Posted maoriaty

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了wechat,wechat-api,mongoose,winston等的使用相关的知识,希望对你有一定的参考价值。

目录:

app.js

const express = require(\'express\');
const app = express();
const wechat = require(\'wechat\');
const config = require(\'./conf/config\');
require(\'./db/mongo\');
const userService = require(\'./service/userService\');
const locationService = require(\'./service/locationService\');
const logger = require(\'./util/logger\');

app.use(config.path,wechat(config.wechat).text(function(message, req, res, next){
    logger.info(\'文本信息:\' + JSON.stringify(message));
    if(message.Content == \'1\'){
        res.reply(\'kkkkkkkkkkkkkkkdkdkddkkdk\');
    }
}).event(function(message, req, res, next){
    logger.info(\'事件消息:\' + JSON.stringify(message));
    if(message.Event === \'LOCATION\'){
        userService.addUser(message.FromUserName, function(err, user){
            if(err) logger.error(\'LOCATION saveOrUpdateUser error: %s\', err)
            locationService.save(message,function(err, location){
                logger.info(\'location is : %s\', location)
                res.reply({type: \'text\', content: location});
                // res.reply(\'\');
            })
        })
    }else if(message.Event === \'subscribe\'){
        res.reply(\'Welcome to subscribe!\')
    }
})
.middlewarify());

const server = app.listen(18080, () => console.log(\'port is %s\',server.address().port));

config.js

const config = {
    mongo: {
        connectStr: \'mongodb://user:123456@47.52.199.163:27017/test\'
    },
    wechat: {
        token: \'maoriaty1\',
        appid: \'wx1af02f9490ff3e98\',
        encodingAESKey: \'\',
        checkSignature: false
    },
    appSecret: \'92bd3a03d76da03abba6b7d1c25c23a7\',
    path: \'/wxService\',
    logStdout: true //是否禁止输出debug日志
}

module.exports = config;

mongo.js

const config = require(\'../conf/config\');
const mongoose = require(\'mongoose\');

module.exports = (function(){
    mongoose.connect(config.mongo.connectStr, {auto_reconnect: true, native_parser: true}, function() {
        console.log(\'mongodb connected\');
    })
    mongoose.set(\'debug\', false);
    connection = mongoose.connection;
    connection.on(\'error\', function(err) {
        console.log(new Date() + \'connect error :\' + err);
    });
    connection.on(\'close\', function(){
        console.log(new Date() + \'connection close retry connect\');
    });
    return connection;
})();

locationModel.js

const mongoose = require(\'mongoose\');
const Schema = require(\'mongoose\').Schema;

const location = new Schema({
    openId: {type: String, required: true},
    loc: {type: [Number], required: true, index: \'2dsphere\', sparse: true},
    precision: {type: Number, required: true, default: 0},
    createTime: {type: Date, required: true, default: Date.now},
    __v: {type: Number, select: false}
},{collection: \'location\'});

module.exports = locationModel = mongoose.model(\'location\', location);

userModel.js

const mongoose = require(\'mongoose\');
const Schema = require(\'mongoose\').Schema;

const sexStates = [0, 2, 3]; //0-未知,1-男,2-女
const User = new Schema({
    openId: {type: String, unique: true, required: true, index: true},
    nickname: {type: String},
    sex: {type: Number, enum: sexStates},
    birthday: {type: Date},
    astroId: {type: String},
    province: {type: String, trim: true},
    city: {type: String, trim: true},
    conuntry: {type: String, trim: true},
    headimgurl: {type: String},
    privilege: {type: Array},
    createTime: {type: Date, default: Date.now, require: true},
    lastUpdateTime: {type: Date, default: Date.now, require: true},
    __v: {type: Number, select: false}
},{collection: \'user\'});

module.exports = userModel = mongoose.model(\'user\', User);

locationService.js

const locationModel = require(\'../model/locationModel\')

exports.save = function(message, callback){
    let location = new locationModel({
        openId: message.FromUserName,
        loc: [message.Longitude, message.Latitude],
        precision: message.Precision,
        createTime: new Date(parseInt(message.CreateTime) * 1000)
    })
    location.save(function(err, loc){
        if(err) console.log(\'save location error : %s\', err)
        if(callback && callback instanceof Function){
            callback(err, loc)
        }
    })
}

userService.js

const config = require(\'../conf/config\');
const userModel = require(\'../model/userModel\');
const wechatApi = require(\'../util/wechatApi\');
const API = wechatApi.API;

exports.addUser = function(openId, callback){
    callback = callback || function(){};
    userModel.findOne({openId: openId}, function(err, user){
        if(err) return callback(err)
        if(user){
            return callback(null, user);
        }else {
            API.getUser(openId, function(err2, newUser){
                if(err2) return callback(err2)
                user = new userModel({
                    openId: newUser.openid,
                    nickname: newUser.nickname,
                    sex: newUser.sex,
                    province: newUser.province,
                    city: newUser.city,
                    country: newUser.country,
                    headimgurl: newUser.headimgurl,
                    privilege: newUser.privilege,
                    createTime: new Date(),
                    lastUpdateTime: new Date()
                })
                user.save(function(err3){
                    if(err3) return callback(err3)
                    callback(null, user)
                })
            })
        }
    })
}

logger.js

const winston = require(\'winston\');
const moment = require(\'moment\');
const config = require(\'../conf/config\');
let customLevels = {
    levels: {
        debug: 0,
        info: 1,
        warn: 2,
        error: 3
    },
    colors: {
        debug: \'blue\',
        info: \'green\',
        warn: \'yellow\',
        error: \'red\'
    }
};

// create the main logger 等级高的包含等级低的输出日志
module.exports = logger = new (winston.Logger)({
    level: \'debug\',
    levels: customLevels.levels,
    transports: [
        new (winston.transports.Console)({
            level: \'error\',
            levels: customLevels.levels,
            timestamp: function(){return moment().format(\'YYYY-MM-DD HH:mm:ss\')},
            colorize: true,
            silent: config.logStdout
        }),
        new (winston.transports.File)({
            name: \'info\',
            filename: \'./logs/info.log\', //项目根目录
            maxsize: 1024 * 1024 * 50, //50M
            level: \'info\',
            levels: customLevels.levels,
            timestamp: function(){return moment().format(\'YYYY-MM-DD HH:mm:ss\')},
            json: false
        })
    ]
})
winston.addColors(customLevels.colors);

wechatApi.js

const config = require(\'../conf/config\');
const mongoose = require(\'mongoose\');
const Schema = require(\'mongoose\').Schema;
const wechatApi = require(\'wechat-api\');
const _ = require(\'underscore\');

let Token = new Schema({
    accessToken: {type: String, required: true},
    expireTime: {type: Number, required: true},
    createTime: {type: Date, default: Date.now, required: true},
    expireAt: {type: Date, required: true, expires: 0, select: false}, //过期自动删除
    __v: {type: Number, select: false}
},{collection: \'token\'});
let tokenModel = mongoose.model(\'token\', Token);

let BaseToken = {
    getWXToken: function(callback){
        tokenModel.findOne({},callback);
    },
    saveWXToken: function(token, callback){
        let update = _.clone(token);
        update.createTime = new Date();
        update.expireAt = new Date(update.expireTime);
        tokenModel.findOneAndUpdate({}, update, {upsert: true}, function(err){
            if(err) console.log(\'save token error : %s\', err)
            callback(err)
        })
    }
}

module.exports.API = new wechatApi(config.wechat.appid, config.appSecret, BaseToken.getWXToken, BaseToken.saveWXToken);

 

以上是关于wechat,wechat-api,mongoose,winston等的使用的主要内容,如果未能解决你的问题,请参考以下文章

将 2 列中的 json 数据与模式中的数据进行比较,并将最新数据覆盖为 mongoos 中的主要数据

Moogose的基本连接以及增删改查操作

mongoose基本增删改查

arch linux或 Manjaro下安装 微信 wechat deepin-wine-wechat

教程三:Wechat库的使用

教程三:Wechat库的使用