sync-service.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  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. } else if (eventDoc.tb == 'albums' || eventDoc.tb == 'videostories') { // albums 和 videostories 表需保留新增的seoTitle,seoDescription字段,避免覆盖
  68. remotedoc.seoTitle = localdoc.seoTitle;
  69. remotedoc.seoDescription = localdoc.seoDescription;
  70. }
  71. await localtb.replaceOne({ _id: eventDoc.rid }, remotedoc);
  72. }
  73. }
  74. }
  75. }
  76. seq = eventDoc._id;
  77. seqDoc.seq = seq;
  78. await seqDoc.save();
  79. count++;
  80. }
  81. console.log(`${format(new Date(), 'yyyy-MM-dd HH:mm')} sync event length: ${eventDocs.length}, precessed: ${count}`);
  82. } catch (err) {
  83. console.error(err);
  84. }
  85. if (count > 0) setTimeout(cycleRun, 0);
  86. // else setTimeout(run, delay);
  87. }, 0);
  88. }
  89. module.exports = {
  90. run
  91. }
  92. if (require.main == module) {
  93. run().catch(console.error);
  94. }