diff --git a/app.js b/app.js index 8a85591..4779dee 100644 --- a/app.js +++ b/app.js @@ -29,7 +29,7 @@ process.on('uncaughtException', err => { * 记录未处理的Promise失败 */ process.on('unhandledRejection', reason => { - logger.errLogger(err); + logger.errLogger(reason); }); // 设置模板引擎 diff --git a/proxy/category.js b/proxy/category.js index 059c233..d39c73c 100644 --- a/proxy/category.js +++ b/proxy/category.js @@ -9,66 +9,54 @@ const i18n = require('../models/i18n'); /** * 获取分类数据 - * @param [cached] 是否读取缓存 - * @param callback 回调函数 + * @param [cached=true] 是否读取缓存 */ -exports.getAll = function (cached, callback) { - if (typeof cached === 'function') { - callback = cached; - cached = true; - } - +exports.getAll = (cached = true) => { // 缓存的key名称 const cache_key = 'categories'; - if (cached) { - // 尝试读取缓存 - redisClient.getItem(cache_key, (err, categories) => { - // 读取缓存出错 - if (err) { - return callback(err); - } - - // 缓存中有数据 - if (categories) { - return callback(null, categories); - } - - // 缓存中没有数据,则从数据库中读取 - categoryModel.find((err, categories) => { - // 读取数据库出错 - if (err) { - return callback(err); - } - - // 从数据库中读到数据 + return new Promise((resolve, reject) => { + if (cached) { + // 尝试读取缓存 + redisClient.getItem(cache_key).then(categories => { + // 缓存中有数据 if (categories) { - // 将数据塞入缓存 - redisClient.setItem(cache_key, categories, redisClient.defaultExpired, err => { - if (err) { - return callback(err); - } - }); + return resolve(categories); } - return callback(null, categories); + + // 缓存中没有数据,则从数据库中读取 + categoryModel.find((err, categories) => { + // 读取数据库出错 + if (err) { + return reject(err); + } + + // 从数据库中读到数据 + if (categories) { + // 将数据塞入缓存 + redisClient.setItem(cache_key, categories, redisClient.defaultExpired); + } + return resolve(categories); + }); + }, err => { + // 读取缓存出错 + reject(err); }); - }); - } else { - categoryModel.find((err, categories) => { - if (err) { - return callback(err); - } - return callback(null, categories); - }); - } + } else { + categoryModel.find((err, categories) => { + if (err) { + return reject(err); + } + return resolve(categories); + }); + } + }); }; /** * 根据分类alias获取分类 * @param alias 分类alias - * @param callback 回调函数 - * @returns {*} */ -exports.getByAlias = function (alias, callback) { +exports.getByAlias = alias => { // 全部分类 const cateAll = { _id: '', @@ -86,46 +74,41 @@ exports.getByAlias = function (alias, callback) { }; const cache_key = `category_${alias}`; - if (alias) { - if (alias === 'other') { - return callback(null, cateOther); - } - redisClient.getItem(cache_key, (err, category) => { - if (err) { - return callback(err); + + return new Promise((resolve, reject) => { + if (alias) { + if (alias === 'other') { + return resolve(cateOther); } - if (category) { - return callback(null, category); - } - categoryModel.findOne({ Alias: alias }, (err, category) => { - if (err) { - return callback(err); - } + redisClient.getItem(cache_key).then(category => { if (category) { - redisClient.setItem(cache_key, category, redisClient.defaultExpired, err => { - if (err) { - return callback(err); - } - }); + return resolve(category); } - return callback(null, category); + categoryModel.findOne({ Alias: alias }, (err, category) => { + if (err) { + return reject(err); + } + if (category) { + redisClient.setItem(cache_key, category, redisClient.defaultExpired); + } + return resolve(category); + }); + }, err => { + reject(err); }); - }); - } else { - return callback(null, cateAll); - } + } else { + resolve(cateAll); + } + }); }; /** * 保存分类数据 * @param array 分类集合 - * @param callback 回调函数 */ -exports.save = function (array, callback) { - let jsonArray = [], - toUpdate = [], - updateQuery = [], - cateNew; +exports.save = array => { + const jsonArray = []; + const toUpdate = []; if (array.length > 0) { array.forEach(item => { jsonArray.push({ @@ -139,58 +122,63 @@ exports.save = function (array, callback) { }); }); } - categoryModel.find((err, categories) => { - if (err) { - return callback(err); - } - categories.forEach(old => { - cateNew = tool.jsonQuery(jsonArray, { _id: old._id }); - if (!cateNew) { - // 该分类将被删除 - toUpdate.push(old._id); - } else { - // 该分类依然存在,则创建时间沿用原创建时间 - cateNew.CreateTime = old.CreateTime; - // 若该分类未做任何修改,则修改时间沿用原修改时间 - if (cateNew.CateName.toString() === old.CateName.toString() && cateNew.Alias.toString() === old.Alias.toString() && cateNew.Img === old.Img && cateNew.Link === old.Link) { - cateNew.ModifyTime = old.ModifyTime; - } - } - }); - - // 将已被删除分类的文章设为"未分类" - if (toUpdate.length > 0) { - toUpdate.forEach(cateId => { - updateQuery.push({ - CategoryId: cateId - }); - }); - post.update({ $or: updateQuery }, { CategoryId: 'other' }, { multi: true }, err => { - if (err) { - return callback(err); - } - }); - } - - // 将分类全部删除 - categoryModel.remove(err => { + return new Promise((resolve, reject) => { + categoryModel.find((err, categories) => { if (err) { - return callback(err); + return reject(err); } - if (jsonArray.length > 0) { - // 插入全部分类 - // categoryModel.create(jsonArray, function (err) {}); //不用这个,因为这个内部实现依然是循环插入,不是真正的批量插入 - // 这里采用mongodb原生的insert来批量插入多个文档 - categoryModel.collection.insert(jsonArray, err => { - if (err) { - return callback(err); + + categories.forEach(old => { + const cateNew = tool.jsonQuery(jsonArray, { _id: old._id }); + if (!cateNew) { + // 该分类将被删除 + toUpdate.push(old._id); + } else { + // 该分类依然存在,则创建时间沿用原创建时间 + cateNew.CreateTime = old.CreateTime; + + // 若该分类未做任何修改,则修改时间沿用原修改时间 + if (cateNew.CateName.toString() === old.CateName.toString() && cateNew.Alias.toString() === old.Alias.toString() && cateNew.Img === old.Img && cateNew.Link === old.Link) { + cateNew.ModifyTime = old.ModifyTime; + } + } + }); + + // 将已被删除分类的文章设为"未分类" + if (toUpdate.length > 0) { + const updateQuery = []; + toUpdate.forEach(cateId => { + updateQuery.push({ + CategoryId: cateId + }); + }); + post.update({ $or: updateQuery }, { CategoryId: 'other' }, { multi: true }, err => { + if (err) { + return reject(err); } - return callback(null); }); - } else { - return callback(null); } + + // 将分类全部删除 + categoryModel.remove(err => { + if (err) { + return reject(err); + } + if (jsonArray.length > 0) { + // 插入全部分类 + // categoryModel.create(jsonArray, function (err) {}); //不用这个,因为这个内部实现依然是循环插入,不是真正的批量插入 + // 这里采用mongodb原生的insert来批量插入多个文档 + categoryModel.collection.insert(jsonArray, err => { + if (err) { + return reject(err); + } + return resolve(); + }); + } else { + return resolve(); + } + }); }); }); }; diff --git a/proxy/log.js b/proxy/log.js index 0b1b8ea..4aff767 100644 --- a/proxy/log.js +++ b/proxy/log.js @@ -4,9 +4,8 @@ const logModel = require('../models/log') /** * 获取所有日志 * @param params 参数对象 - * @param callback 回调函数 */ -exports.getAll = function (params, callback) { +exports.getAll = params => { let page = parseInt(params.pageIndex) || 1; const size = parseInt(params.pageSize) || 10; page = page > 0 ? page : 1; @@ -21,24 +20,27 @@ exports.getAll = function (params, callback) { options.sort = params.sortOrder === 'desc' ? '-timestamp' : 'timestamp'; break; } - logModel.find({}, {}, options, (err, logs) => { - if (err) { - return callback(err); - } - return callback(null, logs); + return new Promise((resolve, reject) => { + logModel.find({}, {}, options, (err, logs) => { + if (err) { + return reject(err); + } + return resolve(logs); + }); }); + }; /** * 获取日志数 - * @param params 参数对象 - * @param callback 回调函数 */ -exports.getAllCount = function (params, callback) { - logModel.count((err, count) => { - if (err) { - return callback(err); - } - return callback(null, count); +exports.getAllCount = () => { + return new Promise((resolve, reject) => { + logModel.count((err, count) => { + if (err) { + return reject(err); + } + return resolve(count); + }); }); }; diff --git a/proxy/post.js b/proxy/post.js index 8adffe5..b4dd012 100644 --- a/proxy/post.js +++ b/proxy/post.js @@ -6,7 +6,6 @@ const tool = require('../utility/tool'); /** * 为首页数据查询构建条件对象 * @param params 查询参数对象 - * @returns {{}} */ function getPostsQuery(params) { const query = {}; @@ -56,37 +55,33 @@ function getPostsQuery(params) { /** * 获取首页的文章数据 * @param params 参数对象 - * @param callback 回调函数 */ -exports.getPosts = function (params, callback) { +exports.getPosts = params => { const cache_key = tool.generateKey('posts', params); - redisClient.getItem(cache_key, (err, posts) => { - if (err) { - return callback(err); - } - if (posts) { - return callback(null, posts); - } - let page = parseInt(params.pageIndex) || 1; - const size = parseInt(params.pageSize) || 10; - page = page > 0 ? page : 1; - const options = {}; - options.skip = (page - 1) * size; - options.limit = size; - options.sort = params.sortBy === 'title' ? 'Title -CreateTime' : '-CreateTime'; - const query = getPostsQuery(params); - postModel.find(query, {}, options, (err, posts) => { - if (err) { - return callback(err); - } + return new Promise((resolve, reject) => { + redisClient.getItem(cache_key).then(posts => { if (posts) { - redisClient.setItem(cache_key, posts, redisClient.defaultExpired, err => { - if (err) { - return callback(err); - } - }); + return resolve(posts); } - return callback(null, posts); + let page = parseInt(params.pageIndex) || 1; + const size = parseInt(params.pageSize) || 10; + page = page > 0 ? page : 1; + const options = {}; + options.skip = (page - 1) * size; + options.limit = size; + options.sort = params.sortBy === 'title' ? 'Title -CreateTime' : '-CreateTime'; + const query = getPostsQuery(params); + postModel.find(query, {}, options, (err, posts) => { + if (err) { + return reject(err); + } + if (posts) { + redisClient.setItem(cache_key, posts, redisClient.defaultExpired); + } + return resolve(posts); + }); + }, err => { + reject(err); }); }); }; @@ -94,29 +89,25 @@ exports.getPosts = function (params, callback) { /** * 获取首页文章的页数 * @param params 参数对象 - * @param callback 回调函数 */ -exports.getPageCount = function (params, callback) { +exports.getPageCount = params => { const cache_key = tool.generateKey('posts_count', params); - redisClient.getItem(cache_key, (err, pageCount) => { - if (err) { - return callback(err); - } - if (pageCount) { - return callback(null, pageCount); - } - const query = getPostsQuery(params); - postModel.count(query, (err, count) => { - if (err) { - return callback(err); + return new Promise((resolve, reject) => { + redisClient.getItem(cache_key).then(pageCount => { + if (pageCount) { + return resolve(pageCount); } - const pageCount = count % params.pageSize === 0 ? parseInt(count / params.pageSize) : parseInt(count / params.pageSize) + 1; - redisClient.setItem(cache_key, pageCount, redisClient.defaultExpired, err => { + const query = getPostsQuery(params); + postModel.count(query, (err, count) => { if (err) { - return callback(err); + return reject(err); } + const pageCount = count % params.pageSize === 0 ? parseInt(count / params.pageSize) : parseInt(count / params.pageSize) + 1; + redisClient.setItem(cache_key, pageCount, redisClient.defaultExpired); + return resolve(pageCount); }); - return callback(null, pageCount); + }, err => { + reject(err); }); }); }; @@ -124,31 +115,30 @@ exports.getPageCount = function (params, callback) { /** * 根据alias获取文章 * @param alias 文章alias - * @param callback 回调函数 */ -exports.getPostByAlias = function (alias, callback) { +exports.getPostByAlias = alias => { const cache_key = `article_${alias}`; + + // 文章浏览数+1 postModel.update({ Alias: alias }, { $inc: { ViewCount: 1 } }) .exec(); - redisClient.getItem(cache_key, (err, article) => { - if (err) { - return callback(err); - } - if (article) { - return callback(null, article); - } - postModel.findOne({ Alias: alias }, (err, article) => { - if (err) { - return callback(err); - } + + return new Promise((resolve, reject) => { + redisClient.getItem(cache_key).then(article => { if (article) { - redisClient.setItem(cache_key, article, redisClient.defaultExpired, err => { - if (err) { - return callback(err); - } - }); + return resolve(article); } - return callback(null, article); + postModel.findOne({ Alias: alias }, (err, article) => { + if (err) { + return reject(err); + } + if (article) { + redisClient.setItem(cache_key, article, redisClient.defaultExpired); + } + return resolve(article); + }); + }, err => { + reject(err); }); }); }; @@ -156,7 +146,6 @@ exports.getPostByAlias = function (alias, callback) { /** * 为后台数据查询构建条件对象 * @param params - * @returns {{}} */ function getArticlesQuery(params) { const query = {}; @@ -208,9 +197,8 @@ function getArticlesQuery(params) { /** * 获取管理页面的文章数据 * @param params 参数对象 - * @param callback 回调函数 */ -exports.getArticles = function (params, callback) { +exports.getArticles = params => { let page = parseInt(params.pageIndex) || 1; const size = parseInt(params.pageSize) || 10; page = page > 0 ? page : 1; @@ -229,26 +217,29 @@ exports.getArticles = function (params, callback) { break; } const query = getArticlesQuery(params); - postModel.find(query, {}, options, (err, posts) => { - if (err) { - return callback(err); - } - return callback(null, posts); + return new Promise((resolve, reject) => { + postModel.find(query, {}, options, (err, posts) => { + if (err) { + return reject(err); + } + return resolve(posts); + }); }); }; /** * 获取管理页面的文章数 * @param params 参数对象 - * @param callback 回调函数 */ -exports.getArticlesCount = function (params, callback) { +exports.getArticlesCount = params => { const query = getArticlesQuery(params); - postModel.count(query, (err, count) => { - if (err) { - return callback(err); - } - return callback(null, count); + return new Promise((resolve, reject) => { + postModel.count(query, (err, count) => { + if (err) { + return reject(err); + } + return resolve(count); + }); }); }; @@ -256,107 +247,103 @@ exports.getArticlesCount = function (params, callback) { * 判断文章Alias是否唯一 * @param alias 文章Alias * @param articleId 文章Id - * @param callback 回调函数 */ -exports.checkAlias = function (alias, articleId, callback) { - postModel.findOne({ Alias: alias }, (err, article) => { - if (err) { - return callback(err); - } - if (!article) { - return callback(null, true); - } - if (article._id === articleId) { - return callback(null, true); - } - return callback(null, false); +exports.checkAlias = (alias, articleId) => { + return new Promise((resolve, reject) => { + postModel.findOne({ Alias: alias }, (err, article) => { + if (err) { + return reject(err); + } + if (!article) { + return resolve(true); + } + if (article._id === articleId) { + return resolve(true); + } + return resolve(false); + }); }); }; /** * 根据id获取文章 * @param id 文章id - * @param callback 回调函数 */ -exports.getById = function (id, callback) { - postModel.findById(id, (err, article) => { - if (err) { - return callback(err); - } - return callback(null, article); +exports.getById = id => { + return new Promise((resolve, reject) => { + postModel.findById(id, (err, article) => { + if (err) { + return reject(err); + } + return resolve(article); + }); }); }; /** * 新增或更新文章 * @param params 参数对象 - * @param callback 回调函数 */ -exports.save = function (params, callback) { - let _id = params.UniqueId, - entity = new postModel({ - Title: params.Title, - Alias: params.Alias, - Summary: params.Summary, - Source: params.Source, - Content: params.Content, - ContentType: params.ContentType || '', - CategoryId: params.CategoryId, - Labels: params.Labels, - Url: params.Url, - IsDraft: params.IsDraft === 'True', - IsActive: params.IsActive === 'True', - ModifyTime: new Date() +exports.save = params => { + const _id = params.UniqueId; + const entity = new postModel({ + Title: params.Title, + Alias: params.Alias, + Summary: params.Summary, + Source: params.Source, + Content: params.Content, + ContentType: params.ContentType || '', + CategoryId: params.CategoryId, + Labels: params.Labels, + Url: params.Url, + IsDraft: params.IsDraft === 'True', + IsActive: params.IsActive === 'True', + ModifyTime: new Date() + }); + return new Promise((resolve, reject) => { + postModel.findById(_id, (err, article) => { + if (err) { + return reject(err); + } + if (!article) { + // 新增 + entity._id = _id; + entity.IsActive = true; + entity.ViewCount = 0; + entity.CreateTime = new Date(); + entity.save(err => { + if (err) { + return reject(err); + } + return resolve(); + }); + } else { + // 更新 + postModel.update({ _id }, entity, err => { + if (err) { + return reject(err); + } + return resolve(); + }); + } }); - postModel.findById(_id, (err, article) => { - if (err) { - return callback(err); - } - if (!article) { - // 新增 - entity._id = _id; - entity.IsActive = true; - entity.ViewCount = 0; - entity.CreateTime = new Date(); - entity.save(err => { - if (err) { - return callback(err); - } - return callback(null); - }); - } else { - // 更新 - postModel.update({ _id }, entity, err => { - if (err) { - return callback(err); - } - return callback(null); - }); - } }); }; /** * 软删除文章 * @param ids 文章id,多个id以逗号分隔 - * @param callback 回调函数 */ -exports.delete = function (ids, callback) { - let idArray = ids.split(','), - hasErr = false, - index = 0; - idArray.forEach(id => { - postModel.update({ _id: id }, { IsActive: false }, err => { - index++; - if (err) { - hasErr = true; - } - if (index === idArray.length) { - if (hasErr) { - return callback(err); - } - return callback(null); - } +exports.delete = ids => { + const idArray = ids.split(','); + const promiseArr = idArray.map(id => { + return postModel.update({ _id: id }, { IsActive: false }).exec() + }); + return new Promise((resolve, reject) => { + Promise.all(promiseArr).then(() => { + resolve(); + }, err => { + reject(err); }); }); }; @@ -364,13 +351,14 @@ exports.delete = function (ids, callback) { /** * 恢复删除的文章 * @param id 文章id - * @param callback 回调函数 */ -exports.undo = function (id, callback) { - postModel.update({ _id: id }, { IsActive: true }, err => { - if (err) { - return callback(err); - } - return callback(null); +exports.undo = id => { + return new Promise((resolve, reject) => { + postModel.update({ _id: id }, { IsActive: true }, err => { + if (err) { + return reject(err); + } + return resolve(); + }); }); }; diff --git a/routes/admin.js b/routes/admin.js index 52cfa6d..1a7cd4a 100644 --- a/routes/admin.js +++ b/routes/admin.js @@ -2,7 +2,6 @@ const express = require('express'); const router = express.Router(); const path = require('path'); const fs = require('fs'); -const async = require('async'); const upload = require('jquery-file-upload-middleware'); const post = require('../proxy/post'); const category = require('../proxy/category'); @@ -20,216 +19,163 @@ upload.configure({ // 网站统计页面 router.get('/', (req, res, next) => { - tool.getConfig(path.join(__dirname, '../config/settings.json'), (err, settings) => { - if (err) { - next(err); - } else { - res.render('admin/index', { - settings, - title: `${settings.SiteName} - ${res.__('layoutAdmin.web_statistic')}` - }); - } + tool.getConfig(path.join(__dirname, '../config/settings.json')).then(settings => { + res.render('admin/index', { + settings, + title: `${settings.SiteName} - ${res.__('layoutAdmin.web_statistic')}` + }); + }, err => { + next(err); }); }); // 分类管理页面 router.get('/categorymanage', (req, res, next) => { - tool.getConfig(path.join(__dirname, '../config/settings.json'), (err, settings) => { - if (err) { - next(err); - } else { - res.render('admin/categorymanage', { - settings, - title: `${settings.SiteName} - ${res.__('layoutAdmin.classified_management')}` - }); - } + tool.getConfig(path.join(__dirname, '../config/settings.json')).then(settings => { + res.render('admin/categorymanage', { + settings, + title: `${settings.SiteName} - ${res.__('layoutAdmin.classified_management')}` + }); + }, err => { + next(err); }); }); // 获取分类数据,不走缓存 router.post('/getCategories', (req, res, next) => { - category.getAll(false, (err, data) => { - if (err) { - next(err); - } else { - res.json(data); - } + category.getAll(false).then(data => { + res.json(data); + }, err => { + next(err); }); }); // 保存分类数据 router.post('/saveCategories', (req, res, next) => { const jsonArray = JSON.parse(req.body.json.substr(1, req.body.json.length - 2)); - category.save(jsonArray, err => { - if (err) { - next(err); - } else { - res.end(); - } + category.save(jsonArray).then(() => { + res.end(); + }, err => { + next(err); }); }); // 文章管理页面 router.get('/articlemanage', (req, res, next) => { - tool.getConfig(path.join(__dirname, '../config/settings.json'), (err, settings) => { - if (err) { - next(err); - } else { - res.render('admin/articlemanage', { - settings, - title: `${settings.SiteName} - ${res.__('layoutAdmin.article_management')}` - }); - } + tool.getConfig(path.join(__dirname, '../config/settings.json')).then(settings => { + res.render('admin/articlemanage', { + settings, + title: `${settings.SiteName} - ${res.__('layoutAdmin.article_management')}` + }); + }, err => { + next(err); }); }); // 获取分类数据,不走缓存 router.post('/getCateFilter', (req, res, next) => { - category.getAll(false, (err, data) => { - if (err) { - next(err); - } else { - res.json(data); - } + category.getAll(false).then(data => { + res.json(data); + }, err => { + next(err); }); }); // 获取文章列表数据 router.post('/getArticles', (req, res, next) => { - let filter, - params = { - pageIndex: req.body.pageNumber, - pageSize: req.body.pageSize, - sortName: req.body.sortName, - sortOrder: req.body.sortOrder, - searchText: req.body.searchText - }; + const params = { + pageIndex: req.body.pageNumber, + pageSize: req.body.pageSize, + sortName: req.body.sortName, + sortOrder: req.body.sortOrder, + searchText: req.body.searchText + }; if (req.body.filter) { - filter = JSON.parse(req.body.filter); + const filter = JSON.parse(req.body.filter); params.cateId = filter.CateName; params.uniqueId = filter.UniqueId; params.title = filter.Title; } - async.parallel([ - // 获取文章列表 - function (cb) { - post.getArticles(params, (err, posts) => { - if (err) { - cb(err); - } else { - cb(null, posts); - } - }); - }, - - // 获取文章总数 - function (cb) { - post.getArticlesCount(params, (err, count) => { - if (err) { - cb(err); - } else { - cb(null, count); - } - }); - }, - - // 获取分类 - function (cb) { - category.getAll(false, (err, categories) => { - if (err) { - cb(err); - } else { - cb(null, categories); - } - }); - } - ], (err, results) => { - let posts, - count, - categories, - post, - cateId, - cateItem, - result = []; - if (err) { - next(err); - } else { - posts = results[0]; - count = results[1]; - categories = results[2]; - posts.forEach(item => { - post = { - UniqueId: item._id, - Alias: item.Alias, - Title: item.Title, - CreateTime: moment(item.CreateTime) - .format('YYYY-MM-DD HH:mm:ss'), - ModifyTime: moment(item.ModifyTime) - .format('YYYY-MM-DD HH:mm:ss'), - Summary: item.Summary, - ViewCount: item.ViewCount, - Source: item.Source, - Url: item.Url, - IsDraft: item.IsDraft, - IsActive: item.IsActive + Promise.all([ + post.getArticles(params), + post.getArticlesCount(params), + category.getAll(false) + ]).then(results => { + const posts = results[0]; + const count = results[1]; + const categories = results[2]; + const result = []; + posts.forEach(item => { + const post = { + UniqueId: item._id, + Alias: item.Alias, + Title: item.Title, + CreateTime: moment(item.CreateTime) + .format('YYYY-MM-DD HH:mm:ss'), + ModifyTime: moment(item.ModifyTime) + .format('YYYY-MM-DD HH:mm:ss'), + Summary: item.Summary, + ViewCount: item.ViewCount, + Source: item.Source, + Url: item.Url, + IsDraft: item.IsDraft, + IsActive: item.IsActive + }; + const cateId = item.CategoryId; + let cateItem; + if (!cateId) { + cateItem = { + _id: '', + Alias: '', + CateName: res.__('Category.all'), + Img: '/static/images/全部分类.svg' }; - cateId = item.CategoryId; - if (!cateId) { - cateItem = { - _id: '', - Alias: '', - CateName: res.__('Category.all'), - Img: '/static/images/全部分类.svg' - }; - } else if (cateId === 'other') { - cateItem = { - _id: 'other', - Alias: 'other', - CateName: res.__('Category.uncate'), - Img: '/static/images/未分类.svg' - }; - } else { - cateItem = tool.jsonQuery(categories, { _id: cateId }); - } - if (cateItem) { - post.CategoryAlias = cateItem.Alias; - post.CateName = cateItem.CateName; - } - result.push(post); - }); - res.json({ - rows: result, - total: count - }); - } + } else if (cateId === 'other') { + cateItem = { + _id: 'other', + Alias: 'other', + CateName: res.__('Category.uncate'), + Img: '/static/images/未分类.svg' + }; + } else { + cateItem = tool.jsonQuery(categories, { _id: cateId }); + } + if (cateItem) { + post.CategoryAlias = cateItem.Alias; + post.CateName = cateItem.CateName; + } + result.push(post); + }); + res.json({ + rows: result, + total: count + }); + }, err => { + next(err); }); }); // 新的文章页面 router.get('/newArticle', (req, res, next) => { - tool.getConfig(path.join(__dirname, '../config/settings.json'), (err, settings) => { - if (err) { - next(err); - } else { - res.render('admin/newarticle', { - uniqueId: shortid.generate(), - settings, - title: `${settings.SiteName} - ${res.__('layoutAdmin.new_article')}` - }); - } + tool.getConfig(path.join(__dirname, '../config/settings.json')).then(settings => { + res.render('admin/newarticle', { + uniqueId: shortid.generate(), + settings, + title: `${settings.SiteName} - ${res.__('layoutAdmin.new_article')}` + }); + }, err => { + next(err); }); }); // 检查文章Alias是否唯一 router.post('/checkArticleAlias', (req, res, next) => { - post.checkAlias(req.body.Alias, req.body.uid, (err, isValid) => { - if (err) { - next(err); - } else { - res.json({ - valid: isValid - }); - } + post.checkAlias(req.body.Alias, req.body.uid).then(isValid => { + res.json({ + valid: isValid + }); + }, err => { + next(err); }); }); @@ -249,12 +195,10 @@ router.post('/saveArticle', (req, res, next) => { IsDraft: req.body.IsDraft, IsActive: req.body.IsActive }; - post.save(params, err => { - if (err) { - next(err); - } else { - res.end(); - } + post.save(params).then(() => { + res.end(); + }, err => { + next(err); }); }); @@ -262,137 +206,81 @@ router.post('/saveArticle', (req, res, next) => { router.get('/editArticle/:id', (req, res, next) => { const id = req.params.id; if (!id) { - res.redirect('/admin/articlemanage'); + return res.redirect('/admin/articlemanage'); } - async.parallel([ - // 获取分类 - function (cb) { - tool.getConfig(path.join(__dirname, '../config/settings.json'), (err, settings) => { - if (err) { - cb(err); - } else { - cb(null, settings); - } - }); - }, - - // 根据文章Id获取文章 - function (cb) { - post.getById(id, (err, article) => { - if (err) { - cb(err); - } else if (!article) { - next(); - } else { - cb(null, article); - } - }); - } - ], (err, results) => { - let settings, - article; - if (err) { - next(err); - } else { - settings = results[0]; - article = results[1]; - res.render('admin/editarticle', { - settings, - post: article, - title: `${settings.SiteName} - ${res.__('layoutAdmin.edit_article')}` - }); - } + Promise.all([ + tool.getConfig(path.join(__dirname, '../config/settings.json')), + post.getById(id) + ]).then(results => { + const settings = results[0]; + const article = results[1]; + res.render('admin/editarticle', { + settings, + post: article, + title: `${settings.SiteName} - ${res.__('layoutAdmin.edit_article')}` + }); + }, err => { + next(err); }); }); // 删除文章 router.post('/deleteArticles', (req, res, next) => { - post.delete(req.body.ids, err => { - if (err) { - next(err); - } else { - res.end(); - } + post.delete(req.body.ids).then(() => { + res.end(); + }, err => { + next(err); }); }); // 还原文章 router.post('/undoArticle', (req, res, next) => { - post.undo(req.body.id, err => { - if (err) { - next(err); - } else { - res.end(); - } + post.undo(req.body.id).then(() => { + res.end(); + }, err => { + next(err); }); }); // 评论管理页面 router.get('/comments', (req, res, next) => { - tool.getConfig(path.join(__dirname, '../config/settings.json'), (err, settings) => { - if (err) { - next(err); - } else { - res.render('admin/comments', { - settings, - title: `${settings.SiteName} - ${res.__('layoutAdmin.comment_management')}` - }); - } + tool.getConfig(path.join(__dirname, '../config/settings.json')).then(settings => { + res.render('admin/comments', { + settings, + title: `${settings.SiteName} - ${res.__('layoutAdmin.comment_management')}` + }); + }, err => { + next(err); }); }); // 留言管理页面 router.get('/guestbook', (req, res, next) => { - tool.getConfig(path.join(__dirname, '../config/settings.json'), (err, settings) => { - if (err) { - next(err); - } else { - res.render('admin/guestbook', { - settings, - title: `${settings.SiteName} - ${res.__('layoutAdmin.msg_management')}` - }); - } + tool.getConfig(path.join(__dirname, '../config/settings.json')).then(settings => { + res.render('admin/guestbook', { + settings, + title: `${settings.SiteName} - ${res.__('layoutAdmin.msg_management')}` + }); + }, err => { + next(err); }); }); // 关于管理页面 router.get('/aboutmanage', (req, res, next) => { - async.parallel([ - // 获取关于数据 - function (cb) { - tool.getConfig(path.join(__dirname, '../config/about.json'), (err, about) => { - if (err) { - cb(err); - } else { - cb(null, about); - } - }); - }, - - // 获取配置 - function (cb) { - tool.getConfig(path.join(__dirname, '../config/settings.json'), (err, settings) => { - if (err) { - cb(err); - } else { - cb(null, settings); - } - }); - } - ], (err, results) => { - let settings, - about; - if (err) { - next(err); - } else { - about = results[0]; - settings = results[1]; - res.render('admin/aboutmanage', { - title: `${settings.SiteName} - ${res.__('layoutAdmin.about_management')}`, - about, - settings - }); - } + Promise.all([ + tool.getConfig(path.join(__dirname, '../config/about.json')), + tool.getConfig(path.join(__dirname, '../config/settings.json')) + ]).then(results => { + const about = results[0]; + const settings = results[1]; + res.render('admin/aboutmanage', { + title: `${settings.SiteName} - ${res.__('layoutAdmin.about_management')}`, + about, + settings + }); + }, err => { + next(err); }); }); @@ -417,41 +305,35 @@ router.post('/saveAbout', (req, res, next) => { // 缓存管理页面 router.get('/cachemanage', (req, res, next) => { - tool.getConfig(path.join(__dirname, '../config/settings.json'), (err, settings) => { - if (err) { - next(err); - } else { - res.render('admin/cachemanage', { - settings, - title: `${settings.SiteName} - ${res.__('layoutAdmin.cache_management')}` - }); - } + tool.getConfig(path.join(__dirname, '../config/settings.json')).then(settings => { + res.render('admin/cachemanage', { + settings, + title: `${settings.SiteName} - ${res.__('layoutAdmin.cache_management')}` + }); + }, err => { + next(err); }); }); // 根据缓存key获取缓存 router.post('/getcache', (req, res, next) => { - redisClient.getItem(req.body.key, (err, data) => { - if (err) { - next(err); + redisClient.getItem(req.body.key).then(data => { + if (data) { + res.json(data); } else { - if (data) { - res.json(data); - } else { - res.end(); - } + res.end(); } + }, err => { + next(err); }); }); // 清除指定key的缓存 router.post('/clearcache', (req, res, next) => { - redisClient.removeItem(req.body.key, err => { - if (err) { - next(err); - } else { - res.end(); - } + redisClient.removeItem(req.body.key).then(() => { + res.end(); + }, err => { + next(err); }); }); @@ -459,15 +341,13 @@ router.post('/clearcache', (req, res, next) => { router.get('/exception', require('connect-ensure-login') .ensureLoggedIn(), (req, res, next) => { - tool.getConfig(path.join(__dirname, '../config/settings.json'), (err, settings) => { - if (err) { - next(err); - } else { - res.render('admin/exception', { - settings, - title: `${settings.SiteName} - ${res.__('layoutAdmin.exception_management')}` - }); - } + tool.getConfig(path.join(__dirname, '../config/settings.json')).then(settings => { + res.render('admin/exception', { + settings, + title: `${settings.SiteName} - ${res.__('layoutAdmin.exception_management')}` + }); + }, err => { + next(err); }); }); @@ -479,65 +359,40 @@ router.post('/getExceptions', (req, res, next) => { sortName: req.body.sortName, sortOrder: req.body.sortOrder }; - async.parallel([ - // 获取异常列表 - function (cb) { - log.getAll(params, (err, logs) => { - if (err) { - cb(err); - } else { - cb(null, logs); - } + Promise.all([ + log.getAll(params), + log.getAllCount(params) + ]).then(results => { + const result = []; + const logs = results[0]; + const count = results[1]; + logs.forEach(item => { + result.push({ + message: item.message, + time: moment(item.timestamp) + .format('YYYY-MM-DD HH:mm:ss.SSS'), + level: item.level, + meta: item.meta }); - }, - - // 获取异常数据总数 - function (cb) { - log.getAllCount(params, (err, count) => { - if (err) { - cb(err); - } else { - cb(null, count); - } - }); - } - ], (err, results) => { - let logs, - count, - result = []; - if (err) { - next(err); - } else { - logs = results[0]; - count = results[1]; - logs.forEach(item => { - result.push({ - message: item.message, - time: moment(item.timestamp) - .format('YYYY-MM-DD HH:mm:ss.SSS'), - level: item.level, - meta: item.meta - }); - }); - res.json({ - rows: result, - total: count - }); - } + }); + res.json({ + rows: result, + total: count + }); + }, err => { + next(err); }); }); // 系统设置页面 router.get('/settings', (req, res, next) => { - tool.getConfig(path.join(__dirname, '../config/settings.json'), (err, settings) => { - if (err) { - next(err); - } else { - res.render('admin/settings', { - settings, - title: `${settings.SiteName} - ${res.__('layoutAdmin.settings')}` - }); - } + tool.getConfig(path.join(__dirname, '../config/settings.json')).then(settings => { + res.render('admin/settings', { + settings, + title: `${settings.SiteName} - ${res.__('layoutAdmin.settings')}` + }); + }, err => { + next(err); }); }); @@ -550,7 +405,7 @@ router.post('/saveSettings', (req, res, next) => { LogoPath: req.body.LogoPath, PageSize: req.body.PageSize, ExpandMenu: req.body.ExpandMenu, - ShowArticleSign:req.body.ShowArticleSign, + ShowArticleSign: req.body.ShowArticleSign, Editor: req.body.Editor, CacheExpired: req.body.CacheExpired, TranslateKey: req.body.TranslateKey, @@ -562,9 +417,9 @@ router.post('/saveSettings', (req, res, next) => { ShowGuestbook: req.body.ShowGuestbook, ChangyanId: req.body.ChangyanId, ChangyanConf: req.body.ChangyanConf, - Email:req.body.EmailAddr, - Author:req.body.AuthorName, - CodeTheme:req.body.CodeTheme + Email: req.body.EmailAddr, + Author: req.body.AuthorName, + CodeTheme: req.body.CodeTheme }); res.end(); }); diff --git a/routes/auth.js b/routes/auth.js index 06015c4..8d9ba07 100644 --- a/routes/auth.js +++ b/routes/auth.js @@ -41,15 +41,13 @@ passport.deserializeUser((id, cb) => { // 后台登录页面 router.get('/login', (req, res, next) => { - tool.getConfig(path.join(__dirname, '../config/settings.json'), (err, settings) => { - if (err) { - next(err); - } else { - res.render('auth/login', { - settings, - title: `${settings.SiteName} - ${res.__('auth.title')}` - }); - } + tool.getConfig(path.join(__dirname, '../config/settings.json')).then(settings => { + res.render('auth/login', { + settings, + title: `${settings.SiteName} - ${res.__('auth.title')}` + }); + }, err => { + next(err); }); }); @@ -67,11 +65,11 @@ router.post('/login', (req, res, next) => { } else { // 登录操作 req.logIn(user, err => { - let returnTo = '/admin'; if (err) { next(err); } else { - // 尝试跳转之前的页面 + // 优先跳转之前的页面 + let returnTo = '/admin'; if (req.session.returnTo) { returnTo = req.session.returnTo; } diff --git a/routes/blog.js b/routes/blog.js index c3435c7..5da385f 100644 --- a/routes/blog.js +++ b/routes/blog.js @@ -2,7 +2,6 @@ const express = require('express'); const router = express.Router(); const path = require('path'); const util = require('util'); -const async = require('async'); const category = require('../proxy/category'); const post = require('../proxy/post'); const tool = require('../utility/tool'); @@ -13,144 +12,48 @@ const showdown = require('showdown'); // 分类页面 router.get('/:category?', (req, res, next) => { const currentCate = req.params.category || ''; - async.parallel([ - // 获取配置 - function (cb) { - tool.getConfig(path.join(__dirname, '../config/settings.json'), (err, settings) => { - if (err) { - cb(err); - } else { - cb(null, settings); - } + Promise.all([ + tool.getConfig(path.join(__dirname, '../config/settings.json')), + category.getAll() + ]).then(results => { + const settings = results[0]; + const categories = results[1]; + const cate = tool.jsonQuery(categories, { Alias: currentCate }); + if (cate || !currentCate || currentCate === 'other') { + res.render('blog/index', { + cateData: categories, + settings, + title: settings.SiteName, + currentCate, + isRoot: false }); - }, - - // 获取分类 - function (cb) { - category.getAll((err, categories) => { - if (err) { - cb(err); - } else { - cb(null, categories); - } - }); - } - ], (err, results) => { - let settings, - categories, - cate; - if (err) { - next(err); } else { - settings = results[0]; - categories = results[1]; - cate = tool.jsonQuery(categories, { Alias: currentCate }); - if (cate || !currentCate || currentCate === 'other') { - res.render('blog/index', { - cateData: categories, - settings, - title: settings.SiteName, - currentCate, - isRoot: false - }); - } else { - next(); - } + next(); } + }, err => { + next(err); }); }); // 获取文章数据 router.post('/getPosts', (req, res, next) => { - async.parallel([ - // 获取文章列表和文章页数 - function (cb) { - async.waterfall([ - // 1. 根据分类alias获取分类对象 - function (cb) { - category.getByAlias(req.body.CateAlias, (err, category) => { - if (err) { - cb(err); - } else { - cb(null, category); - } - }); - }, - - // 2. 传入分类对象查询文章 - function (category, cb) { - const params = { - cateId: category._id, - pageIndex: req.body.PageIndex, - pageSize: req.body.PageSize, - sortBy: req.body.SortBy, - keyword: req.body.Keyword, - filterType: req.body.FilterType - }; - async.parallel([ - // 文章列表 - function (cb) { - post.getPosts(params, (err, data) => { - if (err) { - cb(err); - } else { - cb(null, data); - } - }); - }, - - // 文章页数 - function (cb) { - post.getPageCount(params, (err, data) => { - if (err) { - cb(err); - } else { - cb(null, data); - } - }); - } - ], (err, results) => { - if (err) { - cb(err); - } else { - cb(null, results); - } - }); - } - ], (err, result) => { - if (err) { - cb(err); - } else { - cb(null, result); - } - }); - }, - - // 获取分类 - function (cb) { - category.getAll((err, data) => { - if (err) { - cb(err); - } else { - cb(null, data); - } - }); - } - ], (err, results) => { - let posts, - pageCount, - categories, - i, - len, - cateId, - cateItem, - result = []; - if (err) { - next(err); - } else { - posts = results[0][0]; - pageCount = results[0][1]; - categories = results[1]; + category.getByAlias(req.body.CateAlias).then(cate => { + const params = { + cateId: cate._id, + pageIndex: req.body.PageIndex, + pageSize: req.body.PageSize, + sortBy: req.body.SortBy, + keyword: req.body.Keyword, + filterType: req.body.FilterType + }; + Promise.all([ + post.getPosts(params), + post.getPageCount(params), + category.getAll() + ]).then(results => { + const posts = results[0]; + const pageCount = results[1]; + const categories = results[2]; categories.unshift({ _id: '', Alias: '', @@ -163,168 +66,130 @@ router.post('/getPosts', (req, res, next) => { CateName: res.__('Category.uncate'), Img: '/static/images/未分类.svg' }); - i = 0; - len = posts.length; - for (; i < len; i++) { - result[i] = { - Source: posts[i].Source, - Alias: posts[i].Alias, - Title: posts[i].Title, - Url: posts[i].Url, - PublishDate: moment(posts[i].CreateTime) + const result = []; + posts.forEach(post => { + const obj = { + Source: post.Source, + Alias: post.Alias, + Title: post.Title, + Url: post.Url, + PublishDate: moment(post.CreateTime) .format('YYYY-MM-DD'), - Host: posts[i].Url ? url.parse(posts[i].Url) + Host: post.Url ? url.parse(post.Url) .host : '', - Summary: posts[i].Summary, - UniqueId: posts[i].UniqueId, - ViewCount: posts[i].ViewCount + Summary: post.Summary, + UniqueId: post.UniqueId, + ViewCount: post.ViewCount }; - cateId = posts[i].CategoryId; - cateItem = tool.jsonQuery(categories, { _id: cateId }); + const cateId = post.CategoryId; + const cateItem = tool.jsonQuery(categories, { _id: cateId }); if (cateItem) { - result[i].CategoryAlias = cateItem.Alias; - result[i].CateName = cateItem.CateName; + obj.CategoryAlias = cateItem.Alias; + obj.CateName = cateItem.CateName; } - } - res.send({ posts: result, pageCount }); - } + result.push(obj); + }); + res.json({ posts: result, pageCount }); + }); + }, err => { + next(err); }); }); // 根据文章alias获取预览数据 router.post('/getPreviewContent', (req, res, next) => { - post.getPostByAlias(req.body.alias, (err, data) => { - if (err) { - next(err); + post.getPostByAlias(req.body.alias).then(data => { + let resultContent; + if (data.ContentType === 'markdown') { + const converter = new showdown.Converter(); + converter.setFlavor('github'); + resultContent = converter.makeHtml(data.Content); } else { - let resultContent; - if (data.ContentType === 'markdown') { - const converter = new showdown.Converter(); - converter.setFlavor('github'); - resultContent = converter.makeHtml(data.Content); - } else { - resultContent = data.Content; - } - res.send({ - Content: resultContent, - ContentType: data.ContentType, - Labels: data.Labels - }); + resultContent = data.Content; } + res.json({ + Content: resultContent, + ContentType: data.ContentType, + Labels: data.Labels + }); + }, err => { + next(err); }); }); // 文章详细页 router.get('/:category/:article', (req, res, next) => { - let alias = req.params.article, - cateAlias = req.params.category; - async.parallel([ - // 获取配置 - function (cb) { - tool.getConfig(path.join(__dirname, '../config/settings.json'), (err, settings) => { - if (err) { - cb(err); - } else { - cb(null, settings); - } - }); - }, + const alias = req.params.article; + const cateAlias = req.params.category; + Promise.all([ + tool.getConfig(path.join(__dirname, '../config/settings.json')), + post.getPostByAlias(alias), + category.getAll() + ]).then(results => { + const settings = results[0]; + const article = results[1]; + const categories = results[2]; - // 根据文章alias获取文章对象 - function (cb) { - post.getPostByAlias(alias, (err, data) => { - if (err) { - cb(err); - } else if (data === null) { - next(); - } else { - cb(null, data); - } - }); - }, + // 如果文章已被删除,且当前不是管理员登录状态,则显示 404 + if (!article.IsActive && !req.user) { + return next(); + } - // 获取分类 - function (cb) { - category.getAll((err, data) => { - if (err) { - cb(err); - } else { - cb(null, data); - } + categories.unshift({ + _id: '', + Alias: '', + CateName: res.__('Category.all'), + Img: '/static/images/全部分类.svg' + }); + categories.push({ + _id: 'other', + Alias: 'other', + CateName: res.__('Category.uncate'), + Img: '/static/images/未分类.svg' + }); + const trueCateAlias = tool.jsonQuery(categories, { _id: article.CategoryId }) + .Alias; + if (cateAlias !== trueCateAlias) { + res.redirect(util.format('/blog/%s/%s', trueCateAlias, alias)); + } + + const labels = article.Labels; + const labelList = []; + if (labels) { + labels = JSON.parse(labels); + labels.forEach(lbl => { + labelList.push(lbl.text); }); } - ], (err, results) => { - let settings, - article, - categories, - trueCateAlias, - labels, - labelList = []; - if (err) { - next(err); + const post = { + UniqueId: article.UniqueId, + Title: article.Title, + CategoryAlias: cateAlias, + CateName: tool.jsonQuery(categories, { _id: article.CategoryId }) + .CateName, + CreateTimeStr: moment(article.CreateTime) + .format('YYYY-MM-DD hh:mm'), + ViewCount: article.ViewCount, + LabelList: labelList, + Summary: article.Summary, + ContentType: article.ContentType + }; + let resultContent; + if (article.ContentType === 'markdown') { + const converter = new showdown.Converter(); + converter.setFlavor('github'); + resultContent = converter.makeHtml(article.Content); } else { - settings = results[0]; - article = results[1]; - - // 如果文章已被删除,且当前不是管理员登录状态,则显示 404 - if (!article.IsActive && !req.user) { - return next(); - } - - categories = results[2]; - categories.unshift({ - _id: '', - Alias: '', - CateName: res.__('Category.all'), - Img: '/static/images/全部分类.svg' - }); - categories.push({ - _id: 'other', - Alias: 'other', - CateName: res.__('Category.uncate'), - Img: '/static/images/未分类.svg' - }); - trueCateAlias = tool.jsonQuery(categories, { _id: article.CategoryId }) - .Alias; - if (cateAlias !== trueCateAlias) { - res.redirect(util.format('/blog/%s/%s', trueCateAlias, alias)); - } - - labels = article.Labels; - if (labels) { - labels = JSON.parse(labels); - labels.forEach(lbl => { - labelList.push(lbl.text); - }); - } - const post = { - UniqueId: article.UniqueId, - Title: article.Title, - CategoryAlias: cateAlias, - CateName: tool.jsonQuery(categories, { _id: article.CategoryId }) - .CateName, - CreateTimeStr: moment(article.CreateTime) - .format('YYYY-MM-DD hh:mm'), - ViewCount: article.ViewCount, - LabelList: labelList, - Summary: article.Summary, - ContentType: article.ContentType - }; - let resultContent; - if (article.ContentType === 'markdown') { - const converter = new showdown.Converter(); - converter.setFlavor('github'); - resultContent = converter.makeHtml(article.Content); - } else { - resultContent = article.Content; - } - res.render('blog/article', { - post, - settings, - resultContent, - title: `${settings.SiteName} - ${article.Title}` - }); + resultContent = article.Content; } + res.render('blog/article', { + post, + settings, + resultContent, + title: `${settings.SiteName} - ${article.Title}` + }); + }, err => { + next(err); }); }); diff --git a/routes/index.js b/routes/index.js index fd6a5ac..8f49df2 100644 --- a/routes/index.js +++ b/routes/index.js @@ -1,49 +1,25 @@ const express = require('express'); const router = express.Router(); const path = require('path'); -const async = require('async'); const category = require('../proxy/category'); const tool = require('../utility/tool'); router.get('/', (req, res, next) => { - async.parallel([ - // 获取配置 - function (cb) { - tool.getConfig(path.join(__dirname, '../config/settings.json'), (err, settings) => { - if (err) { - cb(err); - } else { - cb(null, settings); - } - }); - }, - - // 获取分类 - function (cb) { - category.getAll((err, categories) => { - if (err) { - cb(err); - } else { - cb(null, categories); - } - }); - } - ], (err, results) => { - let settings, - categories; - if (err) { - next(err); - } else { - settings = results[0]; - categories = results[1]; - res.render('blog/index', { - cateData: categories, - settings, - title: settings.SiteName, - currentCate: '', - isRoot: true - }); - } + Promise.all([ + tool.getConfig(path.join(__dirname, '../config/settings.json')), + category.getAll() + ]).then(results => { + const settings = results[0]; + const categories = results[1]; + res.render('blog/index', { + cateData: categories, + settings, + title: settings.SiteName, + currentCate: '', + isRoot: true + }); + }, err => { + next(err); }); }); diff --git a/routes/misc.js b/routes/misc.js index 9dbb481..d7915fb 100644 --- a/routes/misc.js +++ b/routes/misc.js @@ -1,64 +1,38 @@ const express = require('express'); const router = express.Router(); const path = require('path'); -const async = require('async'); const tool = require('../utility/tool'); // 留言页面 router.get('/guestbook', (req, res, next) => { - tool.getConfig(path.join(__dirname, '../config/settings.json'), (err, settings) => { - if (err) { - next(err); - } else { - if (settings.ShowGuestbook !== 'true') { - return next(); - } - res.render('misc/guestbook', { - title: `${settings.SiteName} - ${res.__('misc.msg')}`, - settings - }); + tool.getConfig(path.join(__dirname, '../config/settings.json')).then(settings => { + if (settings.ShowGuestbook !== 'true') { + return next(); } + res.render('misc/guestbook', { + title: `${settings.SiteName} - ${res.__('misc.msg')}`, + settings + }); + }, err => { + next(err); }); }); // 关于页面 router.get('/about', (req, res, next) => { - async.parallel([ - // 获取关于数据 - function (cb) { - tool.getConfig(path.join(__dirname, '../config/about.json'), (err, about) => { - if (err) { - cb(err); - } else { - cb(null, about); - } - }); - }, - - // 获取配置 - function (cb) { - tool.getConfig(path.join(__dirname, '../config/settings.json'), (err, settings) => { - if (err) { - cb(err); - } else { - cb(null, settings); - } - }); - } - ], (err, results) => { - let about, - settings; - if (err) { - next(err); - } else { - about = results[0]; - settings = results[1]; - res.render('misc/about', { - title: `${settings.SiteName} - ${res.__('misc.about')}`, - about, - settings - }); - } + Promise.all([ + tool.getConfig(path.join(__dirname, '../config/about.json')), + tool.getConfig(path.join(__dirname, '../config/settings.json')) + ]).then(results => { + const about = results[0]; + const settings = results[1]; + res.render('misc/about', { + title: `${settings.SiteName} - ${res.__('misc.about')}`, + about, + settings + }); + }, err => { + next(err); }); }); diff --git a/routes/ue.js b/routes/ue.js index 224e73c..7cfafda 100644 --- a/routes/ue.js +++ b/routes/ue.js @@ -69,27 +69,24 @@ const storageFile = multer.diskStorage({ }); router.get('/', (req, res, next) => { - let list = [], - total = 0, - rootPath = path.join(__dirname, '../public/uploads/'), - rootFiles, - parFiles, - files, - stat; + const list = []; + let total = 0; + const rootPath = path.join(__dirname, '../public/uploads/'); + let rootFiles; + let parFiles; + let files; + let stat; switch (req.query.action) { - // 获取配置 case 'config': - tool.getConfig(path.join(__dirname, '../config/ue.json'), (err, settings) => { - if (err) { - next(err); - } else { - res.json(settings); - } + tool.getConfig(path.join(__dirname, '../config/ue.json')).then(settings => { + res.json(settings); + }, err => { + next(err); }); break; - // 图片管理 + // 图片管理 case 'listimage': rootFiles = fs.readdirSync(rootPath); rootFiles.forEach(rootFile => { @@ -118,7 +115,7 @@ router.get('/', (req, res, next) => { }); break; - // 附件管理 + // 附件管理 case 'listfile': rootFiles = fs.readdirSync(rootPath); rootFiles.forEach(rootFile => { @@ -152,7 +149,6 @@ router.get('/', (req, res, next) => { router.post('/', (req, res, next) => { let uploadFile; switch (req.query.action) { - // 上传图片 case 'uploadimage': uploadFile = multer({ storage: storageImg }) @@ -172,13 +168,14 @@ router.post('/', (req, res, next) => { }); break; - // 上传涂鸦 + // 上传涂鸦 case 'uploadscrawl': var dataBuffer = new Buffer(req.body.upfile, 'base64'), fileName = `${shortid.generate()}.png`; if (req.query.uniqueId) { - let dirPathParent = path.join(__dirname, '../public/uploads/', req.query.uniqueId), - dirPath = path.join(dirPathParent, 'img'); // 不能直接创建dirPath,因为父目录不存在会抛出异常 + // 不能直接创建dirPath,因为父目录不存在会抛出异常 + const dirPathParent = path.join(__dirname, '../public/uploads/', req.query.uniqueId); + const dirPath = path.join(dirPathParent, 'img'); fs.mkdir(dirPathParent, err => { if (err && err.code !== 'EEXIST') { next(err); @@ -193,7 +190,9 @@ router.post('/', (req, res, next) => { } else { res.json({ state: 'SUCCESS', - url: `/uploads/${req.query.uniqueId}/img/${fileName}`, // 此处不能用path.join,因为path会使用'\'分隔符,而url地址必须是'/'分隔符 + + // 此处不能用path.join,因为path会使用'\'分隔符,而url地址必须是'/'分隔符 + url: `/uploads/${req.query.uniqueId}/img/${fileName}`, title: fileName, original: fileName, error: null @@ -209,7 +208,7 @@ router.post('/', (req, res, next) => { } break; - // 上传附件 + // 上传附件 case 'uploadfile': uploadFile = multer({ storage: storageFile }) .single('upfile'); @@ -219,7 +218,9 @@ router.post('/', (req, res, next) => { } else { res.json({ state: 'SUCCESS', - url: `/uploads/${req.query.uniqueId}/file/${req.file.filename}`, // 此处不能用path.join,因为path会使用'\'分隔符,而url地址必须是'/'分隔符 + + // 此处不能用path.join,因为path会使用'\'分隔符,而url地址必须是'/'分隔符 + url: `/uploads/${req.query.uniqueId}/file/${req.file.filename}`, title: req.file.originalname, original: req.file.originalname, error: null diff --git a/utility/redisClient.js b/utility/redisClient.js index 0ebf334..4d0d331 100644 --- a/utility/redisClient.js +++ b/utility/redisClient.js @@ -16,22 +16,24 @@ if (redisEnable) { * @param key 缓存key * @param value 缓存value * @param expired 缓存的有效时长,单位秒 - * @param callback 回调函数 */ -exports.setItem = function (key, value, expired, callback) { - if (!redisEnable) { - return callback(null); - } - - client.set(key, JSON.stringify(value), function (err) { - if (err) { - return callback(err); +exports.setItem = (key, value, expired) => { + return new Promise((resolve, reject) => { + if (!redisEnable) { + return resolve(); } - if (expired) { - client.expire(key, expired); - } - return callback(null); + + client.set(key, JSON.stringify(value), err => { + if (err) { + return reject(err); + } + if (expired) { + client.expire(key, expired); + } + return resolve(); + }); }); + }; /** @@ -39,16 +41,18 @@ exports.setItem = function (key, value, expired, callback) { * @param key 缓存key * @param callback 回调函数 */ -exports.getItem = function (key, callback) { - if (!redisEnable) { - return callback(null, null); - } - - client.get(key, function (err, reply) { - if (err) { - return callback(err); +exports.getItem = key => { + return new Promise((resolve, reject) => { + if (!redisEnable) { + return resolve(null); } - return callback(null, JSON.parse(reply)); + + client.get(key, function (err, reply) { + if (err) { + return reject(err); + } + return resolve(JSON.parse(reply)); + }); }); }; @@ -57,16 +61,18 @@ exports.getItem = function (key, callback) { * @param key 缓存key * @param callback 回调函数 */ -exports.removeItem = function (key, callback) { - if (!redisEnable) { - return callback(null); - } - - client.del(key, function (err) { - if (err) { - return callback(err); +exports.removeItem = key => { + return new Promise((resolve, reject) => { + if (!redisEnable) { + return resolve(); } - return callback(null); + + client.del(key, err => { + if (err) { + return reject(err); + } + return resolve(); + }); }); }; diff --git a/utility/tool.js b/utility/tool.js index e925245..e593f8b 100644 --- a/utility/tool.js +++ b/utility/tool.js @@ -40,24 +40,22 @@ module.exports = { * 读取配置文件 * @param filePath - 文件路径 * @param [key] - 要读取的配置项key - * @param callback - 回调函数 */ - getConfig(filePath, key, callback) { - if (typeof key === 'function') { - callback = key; - key = undefined; - } - fs.readFile(filePath, 'utf8', (err, file) => { - if (err) { - console.log(`读取文件%s出错:${err}`, filePath); - return callback(err); - } - let data = JSON.parse(file); - if (typeof key === 'string') { - data = data[key]; - } - return callback(null, data); + getConfig(filePath, key) { + return new Promise((resolve, reject) => { + fs.readFile(filePath, 'utf8', (err, file) => { + if (err) { + console.log(`读取文件%s出错:${err}`, filePath); + return reject(err); + } + let data = JSON.parse(file); + if (key) { + data = data[key]; + } + return resolve(data); + }); }); + }, /**