sync-service.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. const utils = require('../libs/utils');
  2. const path = require('path');
  3. const MongoClient = require('mongoose').mongo.MongoClient;
  4. const appConfig = require('../config/app');
  5. const SyncSeq = require('./sync-seq');
  6. const { format } = require('date-fns');
  7. const remotedb = 'coloring_ol'; // 远端数据库
  8. const localdb = 'artsite'; // 本地的数据库
  9. /**
  10. * sync from remote
  11. */
  12. async function run() {
  13. const localClient = await new MongoClient(appConfig.mongodbUrl).connect();
  14. const remoteClient = await new MongoClient(appConfig.syncUrl).connect();
  15. let remoteDB = remoteClient.db(remotedb);
  16. let localDB = localClient.db(localdb);
  17. console.log('Connect to remote mongodb ' + appConfig.syncUrl + ' success!');
  18. // 读取远程syncevent表
  19. const synceventTB = remoteDB.collection('syncevents');
  20. // get current local slave sync seq (use mongoose)
  21. let seq = -1;
  22. let seqDoc = await SyncSeq.findOne();
  23. if (seqDoc) seq = seqDoc.seq;
  24. else seqDoc = new SyncSeq({});
  25. let count, localtb, remotetb, localdoc, remotedoc;
  26. setTimeout(async function cycleRun() {
  27. try {
  28. let eventDocs = await synceventTB.find({ _id: { $gt: seq } }).limit(200).toArray() || [];
  29. count = 0;
  30. for (let i = 0; i < eventDocs.length; i++) {
  31. let eventDoc = eventDocs[i];
  32. console.log(eventDoc);
  33. // 只同步特定的几张表: arts, daily-arts, users, albums, translates
  34. if (eventDoc.tb == 'arts'
  35. || eventDoc.tb != 'daily-arts'
  36. || eventDoc.tb != 'users'
  37. || eventDoc.tb != 'albums'
  38. || eventDoc.tb != 'videostories'
  39. || eventDoc.tb != 'translates') {
  40. if (!eventDoc.db) eventDoc.db = remoteDbs[0];
  41. // 对应的表
  42. remotetb = remoteDB.collection(eventDoc.tb);
  43. localtb = localDB.collection(eventDoc.tb);
  44. if (remotetb && localtb) {
  45. if (eventDoc.op == 'remove') {
  46. await localtb.deleteOne({ _id: eventDoc.rid });
  47. console.log("sync remove : " + eventDoc.tb + " " + eventDoc.rid);
  48. } else if (eventDoc.op == 'save') {
  49. remotedoc = await remotetb.findOne({ _id: eventDoc.rid });
  50. localdoc = await localtb.findOne({ _id: eventDoc.rid });
  51. if (!remotedoc) {
  52. console.log("remote doc not found, may be deleted, skip: " + eventDoc.tb + " " + eventDoc.rid);
  53. } else if (!localdoc) {
  54. console.log("sync add :" + eventDoc.tb + " " + eventDoc.rid);
  55. try {
  56. await localtb.insertOne(remotedoc);
  57. } catch (e) {
  58. console.error(e);
  59. }
  60. } else {
  61. console.log("sync update :" + eventDoc.tb + " " + eventDoc.rid);
  62. if (eventDoc.tb == 'arts') { // art 表需保留新的title,desc,copy 这几个字段,避免覆盖
  63. remotedoc.title = localdoc.title;
  64. remotedoc.desc = localdoc.desc;
  65. remotedoc.seoTitle = localdoc.seoTitle;
  66. remotedoc.seoDescription = localdoc.seoDescription;
  67. remotedoc.open = localdoc.localdoc;
  68. } else if (eventDoc.tb == 'albums' || eventDoc.tb == 'videostories') { // albums 和 videostories 表需保留新增的seoTitle,seoDescription字段,避免覆盖
  69. remotedoc.seoTitle = localdoc.seoTitle;
  70. remotedoc.seoDescription = localdoc.seoDescription;
  71. }
  72. await localtb.replaceOne({ _id: eventDoc.rid }, remotedoc);
  73. }
  74. }
  75. }
  76. }
  77. seq = eventDoc._id;
  78. seqDoc.seq = seq;
  79. count++;
  80. }
  81. await seqDoc.save();
  82. console.log(`${format(new Date(), 'yyyy-MM-dd HH:mm')} sync event length: ${eventDocs.length}, precessed: ${count}`);
  83. } catch (err) {
  84. console.error(err);
  85. }
  86. if (count > 0) setTimeout(cycleRun, 0);
  87. // else setTimeout(run, delay);
  88. }, 0);
  89. }
  90. module.exports = {
  91. run
  92. }
  93. if (require.main == module) {
  94. run().catch(console.error);
  95. }