目录:
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);