zoukankan      html  css  js  c++  java
  • 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);
  • 相关阅读:
    ShopEx customSchema 定制能够依据客户的需求对站点进行对应功能的加入改动或者删除
    Android 屏幕旋转 处理 AsyncTask 和 ProgressDialog 的最佳方案
    NYOJ 46 最少乘法次数
    彻底理解position与anchorPoint
    链路层
    留不住的2015
    javascript笔记
    <html>
    高性能站点建设指南-前端性能优化(一)
    监听器设计模式
  • 原文地址:https://www.cnblogs.com/maoriaty/p/8410054.html
Copyright © 2011-2022 走看看