Articles of asynchronous

节点jsasynchronousmongodb find()查询多个调用

我使用提取logging find()。指定者() 查询。 在那个logging中,有其他文件(表)的关系id。 我想获得上面查找查询结果的每条logging的关系表的logging。 喜欢: db.collection('serviceBooking').find({'request_to_sp_user_id': docs._id.toString()}).toArray(function (err, serviceBookingDocs) { if (serviceBookingDocs.length) { var asyncCalls = []; serviceBookingDocs.forEach(function (bookingRecord, key) { var temp = {}; temp.userDetails = {}; //Async call for getting the user details for all users asyncCalls.push(function (callback) { db.collection('userDetails').findOne({'user_id': new mongo.ObjectID(bookingRecord.booked_by_user_id)}, function (err, userDetailsDocs) { db.collection('serviceBookingDetails').find({'serviceBookingId': bookingRecord._id.toString()}).toArray(function (err, bookingDetailsDocs) { if […]

logging器不会根据需要保存所有日志信息 – 节点jsasynchronous

我有一个伟大的winstonlogging器: var systemLogger = new (winston.Logger)({ transports: [ new (winston.transports.Console)({ timestamp: function () { return moment().format('D/MM/YYYY HH:mm:ss:SSS') }, colorize: true }), new (require('winston-daily-rotate-file'))({ filename: 'logs/-system.log', datePattern: 'dd-MM-yyyy', prepend: true, json: false, timestamp: function () { return moment().format('D/MM/YYYY HH:mm:ss:SSS') }, formatter: formatter }) ] }) 我在我的程序中调用这个logging器: var systemLogger = require('./logging.js') var asyncTasks = [] asyncTasks.push(function(callback) { […]

在使用process.exit() – 节点js时,Winston日志文件并不总是保存

我无法理解这个概念…在将日志文件保存到控制台和实际文件的程序上使用process.exit()时,日志事件全部打印在控制台中,但只有第一个(或者没有全部)保存到文件中。 这是一个问题的快速演示: 在下面的代码中,winstonlogging器是创build。 然后在numberScore函数中,为数组中的每个数字创build一个日志,最后我并行logging所有事件 – 只是一个演示! var async = require('async') var winston = require('winston') var moment = require('moment') var logger = new (winston.Logger)({ transports: [ new (winston.transports.Console)({ timestamp: function () { return moment().format('D/MM/YYYY HH:mm:ss:SSS') }, colorize: true }), new (require('winston-daily-rotate-file'))({ filename: 'logs/-system.log', datePattern: 'dd-MM-yyyy', prepend: true, json: false, timestamp: function () { return moment().format('D/MM/YYYY HH:mm:ss:SSS') […]

发送回复并继续执行Express |的任务 Node.js的

在Node.js(我是新手),我正在尝试接收响应后执行一系列的任务。 但是,我想尽可能快地做出响应。 我不需要将这些任务的结果返回给客户端,所以我试图立即返回响应。 我目前的实施大致是: var requestTime = Date.now; app.post('/messages', function (req, res) { console.log("received request"); // handle the response var body = res.body; res.send('Success'); res.end(); console.log("sent response"); performComplexTasks(body) }) function performComplexTasks(body){ // perform data with body data here; console.log("finished tasks:", Date.now()-requestTime, "ms"); } // ——-LOG———– // received request // POST /api/messages 200 3.685 ms – […]

如何链接之前在forkjoin()操作中的每个observable的组

我在MySQL中有一个订单表,每个订单都有一些关联的文档,不pipe它们是报价单,发票等等。因此有第二个称为“documents”的表,它具有“document_id”主键和“ order_id“外键; 以类似的方式,我还有另一个技术人员对每辆车进行检查的情况,然后是另一张车辆图片。 我正在创build一个使用Node和Express的Web服务,需要返回类似于这个的Json … [ { "order_id": 1003, "customer_id": 8000, "csi": 90, "date_admitted": "2016-10-28T05:00:00.000Z", "plates": "YZG-5125", … documents: { "type": "invoice", "number": "1234", … }, checks: { "scanner": "good", "battery": "average", … }, vehicle_pictures: { "title": "a title…", "path": "the file path" … } }, { … }, … ] 正如你所看到的,有必要为每个订单做三个查询,一个用于检查,另一个用于文档,第三个用于图片,然后我需要将这些子结果添加到最终返回数组中的顺序。 在旧版的同步编程中这将是一件非常容易的事情,但是由于mysql库的连接对象中的query()方法的asynchronous性质,这个威胁变成了一个真正的地狱。 在需要处理单个订单的情况下,使用forkJoin()在服务器上使用RxJS库就足以一次处理所有三个结果,但我不确定如何“链接”每个订单(使用forkJoin来pipe理3个查询),所以一切都得到处理,最后我可以调用res.json(结果),一切整齐。 注意:我想用RxJS来解决这个问题,而不是使用像node-mysql-libmysqlclient这样的同步库软件包。 […]

量angular器:如何确认fs.watch被调用

我正在做e2etesting,我正在检查一个文件夹是否正在用这个代码修改: var watchEvent = false; fs.watch('/tmp/directory', function(event, folderName) { watchEvent = true; console.log("it entered watch"); if (event === "rename" && folderName === currentDirectory) { console.log("my directory changed"); }; }); expect(watchEvent).toBe(true, "My directory didn't change"); 现在我testing了它,它实际上工作,当目录更改时,它进入监视器监听器,打印"it entered watch"和"my directory changed"但由于此调用是asynchronouswatchEvent不会改变的时间和expect返回false 。 现在,当它不工作(所以目录不会改变)它不打印"it entered watch" ,也expect返回false 。 我正在考虑2个select: 当手表完全没有改变时,我可以捕捉到一个方法(工作情况如何,它有多less时间在等待?) 有一种方法可以在variables发生变化时触发事件(一个承诺?),例如我可以: var watchEvent; // 1. watch event is […]

NodeJS脚本和使用jexl处理mongodb文档时的高内存使用率

我已经创build了一个nodejs脚本来处理一个mongodb产品集合。 每个产品都需要使用expression式语言jexl来处理。 最终结果应该是包含所有产品数据的文本文件。 该脚本的作品,但我需要一些帮助来优化它,因为它消耗了大量的内存。 在脚本中,我使用了一个批量为1-5的mongodb光标来限制接收到的文档。 查询接收约9200个文件,平均大小为8.7KB。 使用1的批处理大小需要花费大约200-600 MB的内存。 当我设置批量大小为〜10我得到一个内存不足的例外。 (CALL_AND_RETRY_LAST分配失败 – 进程内存不足)。 我已经试图将jexl.eval注释掉,脚本在几秒钟内运行。 有人有一个想法如何优化这个脚本? lineTemplate是所有jexlexpression式的连接string。 我剪切了这个expression式string,使整个脚本更具可读性。 通常情况下,最后一个expression式“{{attributes [.id == 1 && .language ==”“]属性中的属性是[.id == 1 && .language ==”“] .value:”“}} |” 用不同的ID重复106次。 var async = require("async"); var lineTemplate = '{{no}}|Parent_ID|{{no}}|{{translations[.language == "DE-DE"] in translations ? translations[.language == "DE-DE"].title : ""}}|{{prices[.channel == "DE" && .specialPrice == false] […]

在启动组件之前获取configuration参数

我有一个问题,在我的应用程序组件开始之前,从一个JSON文件中获取configuration参数。 对于这些组件,我需要configuration参数。 没有错误消息,但app.component.ts不启动。 执行停止的地方。 阅读json工作正常。 functiontest.dev.config.json { "name": "DE164813", "node-uri": "http://localhost:4000" } Config.ts import { Injectable } from '@angular/core'; import { Observable } from 'rxjs/Observable'; import { Http, Response } from '@angular/http'; @Injectable() export class Config { private _env: Object constructor(private http: Http) { } load() { return new Promise((resolve, reject) => { this.http.get('functiontest.dev.config.json') .map(res […]

承诺 – 未处理的拒绝挂起请求

我在Node.js中开发一个后端应用程序,遇到以下问题:开发人员调用如下所示的promise函数: mainRouter.get("/xD", async (req, res) => { res.send(await this.fooService.foo()); }); 有可能this.fooService.foo()函数将失败(承诺拒绝),最终用户将得到请求超时。 我想确保开发人员的错误不会导致UnhandledPromiseRejectionWarning(最后超时错误)。 问题是如何configuration应用程序来logging错误,并在出现UnhandleRejection时将状态500返回给用户。 我试过的: mainRouter.get("/xD", async (req, res) => { try { res.send(await this.fooService.foo()); } catch (err) { res.status(500).send("error"); } }); 上面的代码会做的事情,但开发人员要求在每个路线上面写代码,所以这不是一个干净的解决scheme。 我也试图使用错误中间件: mainRouter.use((err:any, req, res, next) => { console.log(err); res.status(500).send("Error"); }); 但是没有收到PromiseRejection 最后,我创build了注册unhandledRecejtion事件的函数处理程序的中间件: mainRouter.use((req, res, next) => { process.on('unhandledRejection', (reason, p) => { console.log(reason); […]

为什么在通过Edge.js从Node.js调用C#时需要等待Task.Run?

我有这个连接到Tobii EyeX眼动追踪设备的EyeX引擎的示例C#代码,订阅凝视数据stream并将结果写入控制台。 var eyeXHost = new EyeXHost(); var stream = eyeXHost.CreateGazePointDataStream(GazePointDataMode.LightlyFiltered); eyeXHost.Start(); stream.Next += (s, e) => Console.WriteLine("Gaze point at ({0:0.0}, {1:0.0}) @{2:0}", eX, eY, e.Timestamp); Console.In.Read(); 我在Edge.js的帮助下从Node.js脚本调用这段代码。 我能够得到它的工作,但我发现我不得不以我不完全理解的方式修改代码。 var eyeXHost = new EyeXHost(); var stream = eyeXHost.CreateGazePointDataStream(GazePointDataMode.LightlyFiltered); await Task.Run(() => eyeXHost.Start()); stream.Next += async (s, e) => { await onGazePoint(new GazePoint(eX, eY, e.Timestamp)); }; […]