baseComponent.js 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. import fetch from 'node-fetch';
  2. import Ids from '../models/ids'
  3. import formidable from 'formidable'
  4. import path from 'path'
  5. import fs from 'fs'
  6. import gm from 'gm'
  7. export default class BaseComponent {
  8. constructor(){
  9. }
  10. async fetch(url = '', data = {}, type = 'GET', resType = 'JSON'){
  11. type = type.toUpperCase();
  12. resType = resType.toUpperCase();
  13. if (type == 'GET') {
  14. let dataStr = ''; //数据拼接字符串
  15. Object.keys(data).forEach(key => {
  16. dataStr += key + '=' + data[key] + '&';
  17. })
  18. if (dataStr !== '') {
  19. dataStr = dataStr.substr(0, dataStr.lastIndexOf('&'));
  20. url = url + '?' + dataStr;
  21. }
  22. }
  23. let requestConfig = {
  24. method: type,
  25. headers: {
  26. 'Accept': 'application/json',
  27. 'Content-Type': 'application/json'
  28. },
  29. }
  30. if (type == 'POST') {
  31. Object.defineProperty(requestConfig, 'body', {
  32. value: JSON.stringify(data)
  33. })
  34. }
  35. let responseJson;
  36. try {
  37. const response = await fetch(url, requestConfig);
  38. if (resType === 'TEXT') {
  39. responseJson = await response.text();
  40. }else{
  41. responseJson = await response.json();
  42. }
  43. } catch (error) {
  44. console.error(error)
  45. throw new Error(error)
  46. }
  47. return responseJson
  48. }
  49. //获取id列表
  50. async getId(type){
  51. const typeList = ['orderId', 'userId', 'addressId', 'cartId', 'imgId'];
  52. if (!typeList.includes(type)) {
  53. console.log('id类型错误');
  54. throw new Error('id类型错误');
  55. return
  56. }
  57. try{
  58. const idData = await Ids.findOne();
  59. idData[type] ++ ;
  60. await idData.save();
  61. return idData[type]
  62. }catch(err){
  63. throw new Error(err)
  64. }
  65. }
  66. async uploadImg(req, type = 'default'){
  67. return new Promise((resolve, reject) => {
  68. const form = formidable.IncomingForm();
  69. form.uploadDir = './public/img/' + type;
  70. form.parse(req, async (err, fields, files) => {
  71. let imgId;
  72. try{
  73. imgId = await this.getId('imgId');
  74. }catch(err){
  75. console.log('获取图片id失败');
  76. fs.unlink(files.file.path)
  77. reject(err);
  78. }
  79. const imgUrl = new Date().getTime().toString() + imgId;
  80. const extname = path.extname(files.file.name);
  81. const repath = './public/img/' + type + '/' + imgUrl + extname;
  82. try{
  83. await fs.rename(files.file.path, repath);
  84. gm(repath)
  85. .resize(400, 400, '!')
  86. .write(repath, async (err) => {
  87. if(err){
  88. console.log('改写图片尺寸失败');
  89. fs.unlink(repath);
  90. reject(err);
  91. }else{
  92. resolve(repath.replace(/^\.\/public/, ''));
  93. }
  94. })
  95. }catch(err){
  96. console.log('改写图片路径失败');
  97. fs.unlink(files.file.path)
  98. reject(err);
  99. }
  100. });
  101. })
  102. }
  103. }