小编swb*_*dit的帖子

如何在NodeJs中使用异步数据源创建可读流?

环境: NodeJS,Express,DynamoDB(但真的可以是任何数据库)

场景: 需要读取大量记录并作为可下载文件返回给用户.这意味着我不能一次缓冲所有内容,然后在Express的响应中发送它.此外,我可能需要多次执行查询,因为在一个查询中可能不会返回所有数据.

建议的解决方案: 使用可以通过管道传输到Express中的响应流的可读流.

我首先创建了一个继承自stream.Readable的对象,并实现了一个推送查询结果的_read()方法.问题是_read()中调用的数据库查询是异步的,但stream.read()是同步方法.

当流通过管道传递给服务器的响应时,在db查询甚至有机会执行之前,会多次调用读取.因此,查询被多次调用,即使查询的第一个实例完成并执行push(null),其他查询也会完成,并且在EOF之后出现"push()"错误.

  1. 有没有办法用_read()正确地做到这一点?
  2. 我应该忘记_read()并只在构造函数中执行查询和push()结果吗?
  3. 我应该执行查询并发出数据事件而不是push()吗?

谢谢

function DynamoDbResultStream(query, options){
    if(!(this instanceof DynamoDbResultStream)){
        return new DynamoDbResultStream(query, options);
    }

    Readable.call(this, options);

    this.dbQuery = query;
    this.done = false;
}
util.inherits(DynamoDbResultStream, Readable);

DynamoDbResultStream.prototype._read = function(){
    var self = this;
    if(!this.done){
        dynamoDB.query(this.dbQuery, function(err, data) {
            if (!err) {
                try{
                    for(i=0;i<data.Items.length;i++){
                        self.push(data.Items[i]);
                    }
                }catch(err){
                    console.log(err);
                }
                if (data.LastEvaluatedKey) {
                    //Next read() should invoke the query with a new start key
                    self.dbQuery.ExclusiveStartKey = data.LastEvaluatedKey;
                }else{
                    self.done=true;
                    self.push(null);
                }
            }else{
                 console.log(err);
                 self.emit('error',err); …
Run Code Online (Sandbox Code Playgroud)

javascript database asynchronous node.js express

19
推荐指数
1
解决办法
1876
查看次数

我可以通过编程方式创建AWS Cognito用户登录吗?

我希望我的应用程序允许用户使用Facebook,Google,Amazon ...等帐户才能登录我的应用程序.这可以通过AWS Cognito正常工作.

但是,如果用户没有任何登录,应用程序是否可以通过编程方式创建用户登录?

  1. 用户将提供id和密码,app将该信息发送给认证提供者以创建新的登录/帐户.

  2. 我不需要实现自己的身份验证机制,并担心如何存储密码等.

根据我的研究,我认为现有的身份验证提供程序甚至OpenID等其他服务都无法做到这一点.

如果我不想实现自己的登录存储和身份验证,您还有其他选择吗?它不一定需要与AWS Cognito集成.

authentication federated-identity amazon-web-services amazon-cognito

7
推荐指数
2
解决办法
2512
查看次数

如何获得没有R中列名的矩阵元素?

这似乎很简单,但我找不到答案.我使用cbind()组合了两个向量.

> first = c(1:5)
> second = c(6:10)
> values = cbind(first,second)
Run Code Online (Sandbox Code Playgroud)

当我想使用值[1,2]检索单个元素时,除了实际元素之外,我总是得到列名.

> values[1,2]

second
6
Run Code Online (Sandbox Code Playgroud)

如何在没有列名的情况下获取值?

我知道我可以删除矩阵中的列名,如下文所示:如何从R中的矩阵中删除列名?但是我怎样才能保留矩阵,只得到我想要的值?

r

4
推荐指数
1
解决办法
3180
查看次数

如何使用restful API 实现对象属性更新?

使用 ServiceStack(面向消息的 RESTful Web 服务)实现对象属性更新的正确方法是什么?

如果客户端需要更新 Foo.bar 并且只有 Foo 的 id。

我应该接受包含 Foo id 和 Foo.bar 值的 FooBarUpdate 请求对象吗?这意味着我必须为每个属性更新创建单独的请求,或者至少为那些我希望更新的请求(或它们的组合)。这似乎也不符合 RESTful 标准。

或者,如果我接受包含具有更新属性的整个 Foo 的 Foo 请求对象,客户端将首先需要检索 Foo,然后服务将检查哪些属性已更新。这似乎是不必要的开销。

最后,如果我接受 Foo 请求但只有 id 和修改后的属性值 (Foo.bar),则 Foo 对象是不完整的,根据其他帖子,这可能会导致混淆,有人认为它是一个完整的对象。

rest updates servicestack

3
推荐指数
1
解决办法
2929
查看次数

无法通过docker查看STDERR输出

我正在运行一个php docker映像(php:5.6-apache),该映像具有apache的错误,并使用符号链接将访问日志分别重定向到STDERR和STDOUT。

当我在前台运行docker映像或访问docker容器日志时,可以看到STDOUT输出。但是我看不到任何错误(即使我生成php错误)。

知道为什么会这样,我如何解决?

我正在为Mac运行docker(但是我认为这没有任何区别)

谢谢

access.log -> /dev/stdout
error.log -> /dev/stderr
other_vhosts_access.log -> /dev/stdout
Run Code Online (Sandbox Code Playgroud)

编辑/解决: 正如@BMitch在下面提到并证明的那样,STDERR重定向可以正常工作。问题出在PHP配置上。如果我使用记录了错误error_log(),它将输出到日志。但是,如果我遇到php错误,例如调用未定义的函数,该错误将永远不会出现在日志中。这似乎有点不一致。任何状况之下, ...

我必须在其中创建一个php.ini文件/usr/local/etc/php/并添加以下两个参数:

log_errors = On
error_log = /var/log/apache2/error.log
Run Code Online (Sandbox Code Playgroud)

然后重新启动docker容器。这导致所有PHP错误都被记录并输出到STDERR。有关示例,请参见@German的答案。

php apache stderr docker

2
推荐指数
1
解决办法
1万
查看次数