- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我一直在尝试弄清楚如何使用 node-fibers 使我的数据库代码在 node.js 中不那么困惑,但我无法让它工作。我将代码归结为最小测试用例:
var Future = require('fibers/future');
var pg=require('pg');
var connstr = "pg://not_the_real_user:or_password@localhost/db";
var pconnect = Future.wrap(pg.connect);
Fiber(function() {
var client = pconnect(connstr).wait();
console.log("called function");
}).run();
如果我保持原样,我会收到以下错误:
pgfuture.js:10
}).run();
^
TypeError: undefined is not a function
at Object.PG.connect.pools.(anonymous function).genericPool.Pool.create (/home/erik/code/treehouse-node/node_modules/pg/lib/index.js:49:20)
at dispense (/home/erik/code/treehouse-node/node_modules/pg/node_modules/generic-pool/lib/generic-pool.js:223:17)
at Object.exports.Pool.me.acquire (/home/erik/code/treehouse-node/node_modules/pg/node_modules/generic-pool/lib/generic-pool.js:267:5)
at PG.connect (/home/erik/code/treehouse-node/node_modules/pg/lib/index.js:75:15)
at Future.wrap (/home/erik/code/treehouse-node/node_modules/fibers/future.js:30:6)
at /home/erik/code/treehouse-node/pgfuture.js:8:18
但是,如果我注释掉调用 pconnect 的行,我会在控制台上收到“被调用函数”消息并且没有错误。 github 页面上的示例具有几乎相同的结构,并且它在我的系统上可以正常工作,但我很困惑我在这里做错了什么。
编辑:附加细节
我已经设法让代码以两种不同的方式运行,这些方式看似无关,但都有相同的行为。函数完成后, Node 挂起,我必须用 ctrl-c 杀死它。为了得到这个结果,我做了两件事:
1) 将 pg.connect 包装在一个匿名函数中,然后用 Future 包装它:
pconnect = Future.wrap(function(err,cb){pg.connect(err,cb);});
2) 这是一个真正的谜,但似乎有相同的结果。在纤程内部,我只是在调用 pconnect 之前直接调用 pg.connect,一切似乎都解决了。
// add this line before call to pconnect
pg.connect(connstr, function(e,c){console.log("connected.");});
// and now the original call to pconnect
var client = pconnect(connstr).wait();
我可以想象这样一种情况,例如,如果 pg.connect 函数有其他可选参数以某种方式干扰 Future.wrap 调用的预期布局,那么 (1) 会有意义。另一种可能性是对象超出范围,并且在实际调用 pconnect 时未定义“this”引用。我不明白为什么(2)有任何效果。
编辑:部分答案
好的,所以我至少回答了部分问题。我对对象作用域的想法被证明是正确的,通过使用 bind() 函数,我能够消除额外的回调包装层:
var pconnect = Future.wrap(pg.connect.bind(pg));
但由于未知原因,它仍然在执行结束时挂起。
最佳答案
您是否在执行结束时断开与数据库的连接?
如果没有,它会阻止 node.js 程序退出。
关于带有 pg/postgres 的 node.js 纤维,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11980231/
是否可以创建 2 个永远相互调用的 Ruby 纤程? Ruby 最终会因堆栈溢出而崩溃,还是 Fibers 不会占用堆栈空间? 最佳答案 如果你用任何编程语言写一个无限循环,某些东西最终会崩溃。我不熟
我使用 ruby1.9.2p180(2011-02-18 修订版 30909)i686-linux。 Fiber#alive? 返回未定义的错误: fiber = Fiber.new{puts '
您好,我正在尝试使用光纤来等待请求,但它给出了错误 “错误:没有光纤就无法等待” 我应该做什么来处理这个问题。顺便说一下,我不使用meteor,只是纯粹的nodejs。 const Fiber = r
我试图理解以下代码片段的行为。我特别关注 Fiber#transfer方法。 require 'fiber' fiber2 = nil fiber1 = Fiber.new do puts "In
futures 如何处理具有多个参数的回调?这对我对 future 的几乎所有用途都至关重要。 github 示例显示它只处理一个参数。 例子来自 Github Readme是 var fileNam
在下面的代码中,光纤按预期工作(“1”和“2”相隔 2 秒打印)。但是,我想从 fiberFunction 返回“3”并同步打印。但这不起作用。这是输出: 1 Temp: undefined 2 有人
我一直在尝试弄清楚如何使用 node-fibers 使我的数据库代码在 node.js 中不那么困惑,但我无法让它工作。我将代码归结为最小测试用例: var Future = require('fib
所以我习惯这样设置助手: useHelper(sLightRef, THREE.SpotLightHelper); return 这将在 SpotLight 对象上创建一个助手。 我不明白的是如何在
前段时间我偶然发现了 node.js 并且非常喜欢它。但很快我发现它严重缺乏执行 CPU 密集型任务的能力。所以,我开始使用谷歌搜索并得到了这些解决问题的答案:Fibers、Webworkers 和
尝试部署新创建的 Meteor (0.9) 应用程序时,我总是在 Modulus 日志中收到此错误消息: module.js:340 throw err; ^ Error: Cannot
我目前陷入了一个关于 ref 对象类型的 typescript 错误(据我所知)。我对 typescript 很陌生,所以我不知道如何解决这个问题! 我已经附加了 tootip typescript
我正在阅读有关并发的内容。我对那些具有令人困惑的相似定义的术语感到有些困惑。即: 流程 话题 “绿色线程” 原型(prototype)线程 纤维 协程 Go 语言中的“Goroutines” 我的印象
我是一名优秀的程序员,十分优秀!