我正在构build一个相对较大的NodeJS应用程序,目前我正试图弄清楚如何从数据库中获取我需要的数据。 这是我的模型的一部分: 一个用户有一个angular色,它可以访问许多模块(其中有一个表role_modules来链接angular色和模块)。 在Rails中,我会做一些像user.role.modules来检索他有权访问的模块列表。 在NodeJS中有点复杂。 我使用node-orm2和PostgreSQL。 这是我到目前为止: req.models.user.find({email: req.body.user}, function(err, user) { user[0].getRole(function(err, role) { role.getModules(function(err, modules) { var list_modules = Array(); modules.forEach(function(item) { console.log(item); list_modules.push(item.name); }) 但我不能这样做,因为item只包含role_id和module_id。 如果我想要这个名字,我将不得不做item.getModule(function() {…}) ,但结果将是asynchronous的…所以我真的不知道我怎么可以结束包含用户有权访问的模块名称的数组…有什么想法? 另外,是不是比实际运行多个JOIN的单个SQL查询慢? 因为就我所见,ORM使得多个查询来获得我想要的数据… 谢谢!
我正在尝试让一些node.js代码弄脏我的手。 我理解事件和callback以及asynchronous技术的理论,但这并不意味着以“正确的方式”真正地生成代码是很容易的。 以下是我的(reallife)中间件的例子。 一个简单的HTTP服务器侦听请求并进行/get ,它会查询我们的后端,并将数据从那里提交给客户端。 var http = require('http') var https = require('https') var url = require('url') var backendOptions = { port: 1414, hostname: 'data.backend.com', path: '/bulk', auth: 'user:$ecret' } var backendGet = function(callback) { https.get(backendOptions, function(res) { var content = '' res.on('data', function(chunk) { content += chunk }) res.on('end', function() { callback(content) }) }) […]
我是新来的Node.js的asynchronous控制stream,我的刮板工作,但我不禁想到,必须有一个更优化(优雅?)的方式做到这一点,我打开使用其他节点库。 进一步来说: 我觉得目前的控制stream程(所有的callback)都很难理解,但也许是因为这对我来说是新的。 似乎有几个库控制stream量,我应该使用它? 最初,我的代码首先完成了所有request ,parsing并保存所有records = [] ,而不是处理将所有内容写入文件。 我在这里改变了代码,这样它会为for循环中的每个loggingrequest – parse – append ,我想确认这种方法对于大量的请求是否更好。 以JSON格式写入logging引起了一些痛苦,目前我必须调用startStep来追加[ first,然后使用(flag? function(){flag = false; return "";}() : ",")来决定是否是第一条logging,如果不是先追加逗号,则追加所有logging,最后追加] 。 再次,我很好奇是否有更好的方法来做到这一点。 为了迭代,我在全局范围声明了这个列表,并且使用list.shift()遍历下一个项目,现在看起来好了,但是我认为这会导致大规模的副作用。 我的直觉是我应该通过这个数组作为一个参数。 再次,我想在这一点上得到确认。 var fs = require('fs'); var request = require("request"); var cheerio = require("cheerio"); function appendFile(_input, callback){ fs.appendFile("./TED/alltalk3.json", _input, function(err){ if(err){ console.log("input is" + _input + "error is […]
我希望能够链接自己可能包括链式方法的方法。 日志应该是“第一,第二,第三”。 但实际上却是“第二,第三,第一”。 我知道这个代码有点多余,但我只是想了解promises / node如何执行。 我将如何编写可以链接在一起的基于承诺的函数? user.increaseReadings(id) .then(function(val) { console.log("second",val); return user.findById(id); }) .then(function(val) { console.log("third",val); res.json(val); }); } 从/models/user模块: exports.findById = findById; function findById(id) { deferred = Q.defer(); User.findById(id, function(err, doc) { if (err) return deferred.reject(err); deferred.resolve(doc); }); return deferred.promise; } exports.increaseReadings = increaseReadings; function increaseReadings(id) { deferred = Q.defer(); findById(id).then(function(doc) { <– […]
如何访问nodej中的mongodb计数结果,以便asynchronous请求可以访问结果? 我可以得到结果并更新数据库,但是asynchronous请求无法访问variables,或者variables是空的,当下一个asynchronous请求发生时,variables似乎会更新。 该请求不得等待查询完成,并且下一个请求将填充上一个请求的variables。 testOne.increment = function(request) { var MongoClient = require('mongodb').MongoClient, format = require('util').format; MongoClient.connect('mongodb://127.0.0.1:27017/bbb_tracking', function(err, db) { if (err) throw err; collection = db.collection('bbb_tio'); collection.count({vio_domain:dom}, function(err, docs) { if (err) throw err; if (docs > 0) { var vio_val = 3; } else { var vio_val = 0; } if (vio_val === 3) { […]
我正在做一个小的nodejs程序,并且有一些麻烦知道程序的所有asynchronous操作何时完成。 目前,该程序执行以下步骤: 1 /用一些参数产生一个进程。 这个过程将在其stdout上打印数据。 2 /听取进程标准输出“数据”事件,每次打印某些东西时,程序会调用一个函数(我们将称之为“进程”),使用这些数据。 3 /这个过程函数将最终将数据插入到mongo数据库并发送消息给amqp服务器。 3 /当没有更多数据时,由于与amqp和mongo数据库的连接仍然存在,所以程序空闲,所以我需要知道所有工作何时能够closures连接。 所以,我试图使用when.js来使用promise,但是我不能让它为我想要实现的目的而工作。 我让“process”函数返回一个promise,当mongodb insert和amqp消息发送完成后,这个promise就会被parsing。 在我的程序中,我正在创build一个数组,它将接收所有可以调用when.all()以了解何时全部parsing的承诺。 但是,因为当生成的进程将数据打印到它的stdoutstream时,我正在asynchronous创buildpromise,所以调用when.all()是由一个看起来立即解决的空数组构成的。 这里是一个代码示例,说明我实现了什么: var when = require('when') , _ = require('lodash') , cp = require('child_process'); var promises = []; function process(data) { var deferred = when.defer(); setTimeout(function () { deferred.resolve(true); }, 3000); // Let's say we need 3 seconds to process […]
最近我一直在使用Node.js,并且遇到问题,find一种方法来跟踪返回到请求的subprocessstdout的结果。 我有一个文件中的主机名列表,我的应用程序读取文件,使用一个简单的正则expression式从文件中一次一行地拉动主机名,使用拆分。 然后我创build一个主机名数组。 然后,对于数组中的每个主机名我build立一个参数string,并使用该参数string产生一个进程,但是,我没有办法从进程内访问计数variables“我”,我无法find一种方式来跟踪结果返回到input。 我的程序应该采取每个主机名称,并使用“subprocess”调用snmp,然后它应该创build和arrays{主机名:“snmp-result”},最后一次完成后,将数组保存到文件。 我正在使用此程序尝试从networking设备中提取序列号。 我已经重写了这个代码大约5次,我甚至用一个函数嵌套在spawn过程中,而不是一个on数据事件发射器,但是我很茫然。 相关代码如下: var spawn = require('child_process').exec; var split = require('split'); var fs = require('fs'); var snRe = '"(.*?)"'; var devRe = "(junos\\-([az]|[0-9])+\\-([az]|[0-9])+$)"; var devices = []; var output = []; var outfile = fs.createWriteStream('vri.txt',{'flags':'w'}); var infile = fs.createReadStream('devices',{flags: 'r', encoding: 'utf8'}) var spawnCmd = "/usr/local/bin/snmpwalk -v2c -c public" var […]
我有一个asynchronous函数返回一个随机的学生。 现在我想要一个函数,返回两个独特的学生 – 我的问题的来源。 getTwoRandom = function(req) { var deferred = Q.defer(); Q.all([ Student.getRandom(req), Student.getRandom(req) ]) .then(function(students){ if(students[0]._id !== students[1]._id) { //check unique deferred.resolve(students); } else { //students are the same so try again… this breaks return getTwoRandom(req); } }); return deferred.promise; }; 然后进一步下来我有这样的事情: getTwoRandom(req).then(function(students) { //do what I want… }); 问题是我什么时候return getTwoRandom(req); .then()函数下线不会触发…这是否返回一个不同的承诺,即.then()使用?
我正在将一个缓慢的asynchronous谓词函数(它调用一个外部HTTP API)应用到N个input的列表中。 我只需要任何M(其中M <= N)的input,函数返回true。 我的第一个尝试是: var async = require('async'); function asyncFilterFirstM(inputs, m, fn, finalCb) { var outs = []; var alreadyReturned = false; async.map(inputs, function(input, cb) { fn(input, function(ret) { if (ret) { outs.push(input); if (outs.length === m) { alreadyReturned = true; finalCb(null, outs); } } cb(null, ret); }); }, function(err) { if (!alreadyReturned) […]
我有一个build立在node.js上的服务器。 以下是请求处理函数之一: var exec = require("child_process").exec function doIt(response) { //some trivial and fast code – can be ignored exec( "sleep 10", //run OS' sleep command, sleep for 10 seconds //sleeping(10), //commented out. run a local function, defined below. function(error, stdout, stderr) { response.writeHead(200, {"Content-Type": "text/plain"}); response.write(stdout); response.end(); }); //some trivial and fast code – can […]