我在node.js中有以下模块: var obj = {}; obj.prop1 = "value1"; obj.prop2 = "value2"; asyncFunction(function(data) { obj.prop3 = data; // I would like to do: obj.emit("completed"); }); module.exports = obj; 所以我可以像这样导入它: var imp = require('./obj'); imp.on("completed", function() { console.log("Hello!"); }); 我该怎么做?
使用内置支持线程的语言似乎是一个相当简单的任务,但是, 有没有办法终止/超时长时间运行的方法/无限recursion方法? 例如,如果我有一个以callback为参数的API,并且在调用之前和之后做一些处理并返回结果。 function api(data,callback) { processedData = before(data); result = callback(processedData); processedResult = after(result); return processedResult; } 如果臭名昭着的开发人员跟随这个APIcallback function cpuFrenzy(data) { while(true); } result = api( {} , cpuFrenzy); render(result); 和API的结果是用来呈现HTML。 节点js是单线程将阻止所有请求到服务器! 那么是否有任何方法让api超时/终止callback方法的执行,如果超过预设时间,为了避免阻止所有的web请求? 如果没有,有没有其他方法来实现这个API?
有没有可能写非阻塞response.write? 我已经写了一个简单的testing,看看其他客户端可以连接,而一个下载文件: var connect = require('connect'); var longString = 'a'; for (var i = 0; i < 29; i++) { // 512 MiB longString += longString; } console.log(longString.length) function download(request, response) { response.setHeader("Content-Length", longString.length); response.setHeader("Content-Type", "application/force-download"); response.setHeader("Content-Disposition", 'attachment; filename="file"'); response.write(longString); response.end(); } var app = connect().use(download); connect.createServer(app).listen(80); 这似乎是write封锁! 难道我做错了什么? 更新所以,它不会阻塞,并在同一时间阻止。 这并不意味着可以同时下载两个文件。 而且它阻止了创build缓冲区是一个漫长的操作。
所以我在Node.js中开始了一个小项目来学习一些。 这是一个简单的caching代理arch Linux的包系统,因为节点提供了大部分繁重的工作。 这有两个“主要”阶段,服务器设置和服务。 然后服务有两个主要阶段,响应设置和响应。 “主”设置涉及检查一些文件,从文件加载一些configuration。 从一个Web地址加载一些JSON。 然后用这个信息启动http服务器和代理实例。 设置logging器/选项 – 读取configuration – 读取镜像 – 读取webmirror 开始服务 服务涉及检查请求以查看文件是否存在,如果需要则创build目录,然后提供响应。 检查请求 – 检查目录 – 检查文件 代理请求或服务文件 我一直将它们称为同步点,但search不会导致很多结果。 在进程完成下一步之前必须完成一组asynchronous任务的点。 Perl的AnyEvent有条件variables ,我猜是我试图做的,没有阻塞。 首先,我发现我是“作弊”,并使用提供的任何function的同步版本,但必须停止与Web请求,所以我开始重组的东西。 立即大多数search导致使用asynchronous或步骤来控制stream量。 首先,我尝试了大量的系列/并行设置,但是如果在函数下面有任何asynchronous调用会立即“完成”并且系列将会完成,则会遇到问题。 经过多次的唠叨和咬牙切齿之后,我最终用了一个“服务员”function,使用async.until来testing在启动下一个function之前完成的所有任务所设置的一些程序状态。 // wait for "test" to be true, execute "run", // bail after "count" tries, waiting "sleep" ms between tries; function waiter( test, run, count, […]
我是Node.js的初学者,在这段代码中遇到了麻烦。 var fs = require('fs'); Framework.Router = function() { this.run = function(req, res) { fs.exists(global.info.controller_file, function(exists) { if (exists) { // Here's the problem res.writeHead(200, {'Content-Type':'text/html'}); var cname = App.ucfirst(global.info.controller)+'Controller'; var c = require(global.info.controller_file); var c = new App[cname](); var action = global.info.action; c[action].apply(global.info.action, global.info.params); res.end(); } else { App.notFound(); return false; } }); } […]
如果我使用这个代码: async.eachLimit(body.photos.photo, 10, function(photo) { var flickr_getphoto_path = "….."; request.get({url: flickr_host_url + flickr_getphoto_path, json: true}, function(error, response, body) { if (!error && response.statusCode == 200) { console.log("SIZES LENGTH: " + body.sizes.size.length); var source_url = body.sizes.size[body.sizes.size.length – 1].source; request(source_url).pipe(fs.createWriteStream(path_for_downloads + path.basename(source_url))); } }); } 处理在10个请求后(即在第一个周期之后)停止。 应该有10个周期。 有人知道为什么它不能正常工作?
在node.js中我想要做的同步版本(简化为可读性): var value = null; var allValues = []; do{ value = getValue(value); //load the next value if(value) allValues.push(value); }while(value); console.log("Got all values:",allValues); 目标是遍历所有的值,但是除非我传入当前值,getValue函数将简单地返回第一个值(导致无限循环)。 在node.js中,getValue()函数是asynchronous的,我希望它是asynchronous的,但是如果我这样做: var allValues = []; function iterateGetValue(value){ if(value){ allValues.push(value); getValue(value,iterateGetValue); }else console.log("Got all values:",allValues); } getValue(null,iterateGetValue); 我担心N次迭代(getValue可能会在结束之前触发数千次),我会遇到栈限制问题(我是不正确的?)。 我已经看了Promise和其他asynchronous技巧,但他们都看起来继续推动堆栈(我是不正确的?)。 我的堆栈限制假设是不正确的,还是有一些明显的方法来做到这一点,我错过了? 此外,我不能忙 – 等待asynchronousgetValue变成一个同步的getValue,这使用asynchronous的全部目的。
我正在尝试解决考试问题,所以无法发布我的考试代码。 所以我已经简化了,以至于说明了我不了解的核心概念。 基本上,我不知道如何减慢节点的asynchronous执行速度,这样我的mongo代码才能赶上它。 这里是代码: MongoClient.connect('mongodb://localhost:27017/somedb', function(err, db) { if (err) throw err; var orphans = []; for (var i; i < 100000; i++) { var query = { 'images' : i }; db.collection('albums').findOne(query, function(err, doc_album) { if(err) throw err; if (doc_album === null) { orphans.push(i); } }); } console.dir(orphans.length); return db.close(); }); 所以我想创build一个不符合我的查询条件的图像数组。 由于Node不会等待callback完成,所以最终得到的orphans.length值为0。 我怎样才能修改代码,使callback完成执行之前,我不符合我的查询条件数组中的图像数量? […]
我是JsonRestStores的作者。 我一直推迟这个问题太久了。 这是一个可以赢得“年度最愚蠢缩进function”奖的function。 主要的粘性问题是closuresvariables有一点变化: body[ self.idProperty ] = params[ self.idProperty ]; 还有一个“如果”使事情变得有趣。 所以…有没有一种优雅的方式来把这个function变成一个看起来不像箭头那样的两个戳? 如果是这样,你能提供一个示例实现? _makePostAppend: function( params, body, options, next ){ var self = this; var body; if( typeof( next ) !== 'function' ) next = function(){}; // Check that the method is implemented if( ! self.handlePostAppend ){ self._sendError( next, new self.NotImplementedError( ) ); return; […]
我正在尝试编写一个Node程序,用我在磁盘上的文件中的数据填充我的MySQL数据库。 我可能会也可能不会以正确的方式进行,但是它正在工作。 我遇到的麻烦是理解我应该如何处理,允许asynchronous函数在连接到数据库之前完成。 最终,我将阅读大量的数据文件,并像下面这样将它们插入到数据库中。 我可以只使用readFileSync而不是asynchronous版本,但是我需要更好地处理asynchronous函数。 当我插入下面的葡萄酒类别时,它工作正常,因为它不使用asynchronousfunction。 但是,当我使用readFile从文件中获取数据时,出现连接在任何查询执行之前结束的错误: connection.connect( function(err) { if(err) { console.log(err); } }); // Take a table and the values, and insert a new row into a table function insert_into( table, values ) { if( values instanceof Array ) { values = values.map( function( value ) { return '"' + value + '"'; […]