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);
原文地址:https://www.cnblogs.com/maoriaty/p/8410054.html