我正在开发一个应用程序,该应用程序从Outlook邮件中的某些邮件中获取附件。我有一个Mongodb来存储这些附件中的信息。问题是,接收这些附件的过程非常耗时,这就是为什么我想让它在除主线程之外的其他线程中工作,如果我想要的话取消它或以某种方式跟踪它的进度。
现在,我知道nodejs的主要问题是它是单线程的。但是,尽管如此,我还是找到了一些模块,例如Bull,Webworker-threads或workerpool,它们可能对我有帮助,当然,我尝试使用Node的ChildProcess。这些模块的主要问题是它们可以从文件运行异步代码,也可以使用不依赖于当前数据的静态函数(据我从示例和文档中了解的那样)。但是在我的情况下,我不能以这种方式使用。
问题是-我有没有办法改变我的整个代码架构以异步运行类方法?
//sync.running.controller.ts
import { ConfigServiceFuncs } from "../config.service";
import { SyncRunningService } from "./sync.running.service";
export class SyncRunningController {
constructor(private readonly configService : ConfigServiceFuncs, private readonly syncService : SyncRunningService) {}
//Method that runs when a Put request is made
@Put
//I want to have it working in another thread so that I could send another requests, like Delete or Get
async StartUpdate() {
this.syncService.startSync();
}
}
//sync.running.service.ts
import {GetMessagesFromMail } from "./code.js";
@Injectable()
export class SyncRunningService {
constructor(@Inject('SOME_MODEL') private readonly syncModel : Model<SomeModel>, private readonly configService : ConfigServiceFuncs){}
async syncFunc(){
this.syncDatabase();
}
async SyncDatabase(){
databaseObjects = await GetMessagesFromMail();
/*
Then goes the code for adding info to database
*/
}
}
}
答案 0 :(得分:0)
我想出了一种解决此问题的方法。感谢 mongoose https://mongoosejs.com/,我得以通过mongoDB的功能与之通信。 因此,我能够创建一个独立的.ts文件,创建类来访问Controller和Service的方法。
接下来,我使用Nodejs的Child_Process fork(),这样我就可以使用异步功能。
我认为此解决方案的主要问题是重复代码,这样,每次在其余代码中更新架构时,我们将需要更新架构。
//sync.ts - standalone file
//imports
var mongoose = require('mongoose');
mongoose.connect('mongodb://path/to/database', {useNewUrlParser : true});
var db = mongoose.connection;
db.once('open',function(){
//functions to create models
function CreateModel1(){
var schema = new mongoose.Schema({
//declare your schema here
});
var model = mongoose.model('Model1',schema);
return model;
}
/*
same function for Model2
*/
var model1 = CreateModel1();
var model2 = CreateModel2();
//declare class instances for your service class, if any
var syncServiceClass = new SyncRunningService(/* ... */);
(async function(){
syncServiceClass.syncFunc();
})();
}
//.controller.ts
/*
...
*/
async StartUpdate(){
const child_process = require('child_process');
var worker_process = child_process.fork(__dirname + "/sync.ts");
worker_process.on('close',function(){
console.log("child process was finished");
return;
}
}