小编zha*_*hou的帖子

Node.js amqplib何时关闭连接

我正在使用amqplib在node.js服务器中传输消息。我从RabbitMQ官方网站上看到了一个例子:

var amqp = require('amqplib/callback_api');

amqp.connect('amqp://localhost', function(err, conn) {
  conn.createChannel(function(err, ch) {
    var q = 'hello';
    var msg = 'Hello World!';

    ch.assertQueue(q, {durable: false});
    // Note: on Node 6 Buffer.from(msg) should be used
    ch.sendToQueue(q, new Buffer(msg));
    console.log(" [x] Sent %s", msg);
  });
  setTimeout(function() { conn.close(); process.exit(0) }, 500);
});
Run Code Online (Sandbox Code Playgroud)

在这种情况下,连接将在超时功能中关闭。我认为这不是可持续的方式。但是,ch.sendToQueue没有回调函数,允许我在发送消息后关闭连接。紧密连接有什么好处?

javascript rabbitmq node.js

6
推荐指数
1
解决办法
1721
查看次数

设置验证的默认值

我正在使用Joi来验证我的node.js服务器中使用hapijs框架的服务的有效负载.它曾经看起来像这样(在我的打字稿代码以及编译成javascript后):

payload: {
    para1: Joi.number().required(),
    para2: Joi.string()
}
Run Code Online (Sandbox Code Playgroud)

现在我想设置两个参数的默认值.如果代码是用javascript编写的,我可以这样做:

payload: {
    para1: Joi.number().required().default(1),
    para2: Joi.string().default("defaultstring")
}
Run Code Online (Sandbox Code Playgroud)

我在swagger中测试了它,默认值实际上变成了我设置的值.

但是,我的项目是用打字稿编写的.我做了同样的事情并编译​​了打字稿代码.结果javascript看起来像这样:

 payload: {
    para1: Joi.number().required()["default"](1),
    para2: Joi.string()["default"]("defaultstring")
 }
Run Code Online (Sandbox Code Playgroud)

在招摇时,不应用默认值.

这是我的问题:

  1. 为什么代码在编译后会变得不同?
  2. 什么["default"]("defaultstring")意思,它做什么?
  3. 如何编写打字稿代码以确保它可以编译为 Joi.string().default("defaultstring")

更新

根据@ rsp的帖子,问题2中的格式只是访问对象属性的不同方式.我也可以从这里得到参考.但它没有解释它们是否有任何区别.有谁有想法吗?

UPDATE2

以下是访问JS属性的两种方式之间的区别.使用括号方式似乎没有负面影响.但是,在我的情况下,默认值不会反映在swagger上.将对它进行研究.

javascript node.js typescript hapijs joi

5
推荐指数
1
解决办法
3376
查看次数

Socket.io意外断开连接

我有node.js服务和角度客户端使用socket.io在长时间的http请求期间传输一些消息.

服务:

export const socketArray: SocketIO.Socket[] = [];
export let socketMapping: {[socketId: string]: number} = {};

const socketRegister: hapi.Plugin<any> = {
    register: (server) => {
        const io: SocketIO.Server = socket(server.listener);

        // Whenever a session connected to socket, create a socket object and add it to socket array
        io.on("connection", (socket) => {
            console.log(`socket ${socket.id} connected`);
            logger.info(`socket ${socket.id} connected`);

            // Only put socket object into array if init message received
            socket.on("init", msg => {
                logger.info(`socket ${socket.id} initialized`);
                socketArray.push(socket);
                socketMapping[socket.id] = msg;
            }); …
Run Code Online (Sandbox Code Playgroud)

javascript websocket node.js socket.io angular

5
推荐指数
1
解决办法
745
查看次数

Wireguard VPN 无法从服务器接收数据

我的wireguard服务器和客户端配置如下:

服务器:

[Interface]
PrivateKey = <server private key>
Address = 192.168.2.4
ListenPort = 51821

[Peer]
PublicKey = <client public key>
AllowedIPs = 172.20.10.5/32

Run Code Online (Sandbox Code Playgroud)

客户:

[Interface]
PrivateKey = <client private key>
Address = 172.20.10.5

[Peer]
PublicKey = <server public key>
AllowedIPs = 192.168.2.4/32
Endpoint = <Public IP>:51821
PersistentKeepalive = 25

Run Code Online (Sandbox Code Playgroud)

当我启动它们时,我的客户端无法 ping 服务器网络中的任何机器。在浏览器中,该 IP 仍然是客户端的 Internet IP。当我wg在客户端上运行时,它显示发送了一些数据,而在传输信息中收到了 0 个数据。

我的配置有什么明显的错误吗?如果没有,常见的故障排除方法是什么?

wireguard

5
推荐指数
0
解决办法
5626
查看次数

为什么必须提供angular2组件构造函数参数

我是Angular的新手.当我在做Heros教程时,我注意到组件构造函数参数的类型必须是依赖项.换句话说,我必须将它包含在providers数组中.

例如:

import { SomeServiceClass } from '...';
@Component({
  ...
})
export class MyComponent implements OnInit {

  constructor(input1: SomeServiceClass) { }

  ngOnInit() {
  }
}
Run Code Online (Sandbox Code Playgroud)

除非我在providers数组中包含SomeServiceClass,否则此代码不会起作用.我试过了input1: string.它既不起作用!我相信它是完全有效的打字稿代码.问题必须是angular2实例化组件类的方式.

问题1:如何将组件分类实际由Angular实例化?

而且,由于我从不实例化服务类,我无法想象将哪个服务类实例传递给组件构造函数.

问题2:angular是否创建了每个组件使用的一个服务实例,或者为每个组件生成一个实例?

constructor typescript angular-components angular

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

d3 平移和缩放时更新旧比例

我是 d3 的新手。当使用 进行平移和缩放时d3v4,我注意到我们总是必须基于 来创建新比例并将d3.event.transform新比例应用于所有内容,而不是用新比例替换旧比例并再次应用旧比例。例如,这个缩放功能就可以完美运行:

function zoomFunction(){
  // create new scale ojects based on event
  var new_xScale = d3.event.transform.rescaleX(xAxisScale)
  var new_yScale = d3.event.transform.rescaleY(yAxisScale)
  console.log(d3.event.transform)

  // update axes
  gX.call(xAxis.scale(new_xScale));
  gY.call(yAxis.scale(new_yScale));

  // update circle
  circles.attr("transform", d3.event.transform)
};
Run Code Online (Sandbox Code Playgroud)

这个缩放功能搞砸了一切:

function zoomFunction(){
  // create new scale ojects based on event
  var new_xScale = d3.event.transform.rescaleX(xAxisScale)
  var new_yScale = d3.event.transform.rescaleY(yAxisScale)
  xAxisScale = new_xScale;
  yAxisScale = new_yScale;
  console.log(d3.event.transform)

  // update axes
  gX.call(xAxis.scale(xAxisScale));
  gY.call(yAxis.scale(yAxisScale));

  // update circle
  circles.attr("transform", d3.event.transform)
};
Run Code Online (Sandbox Code Playgroud)

完整的示例在这里:https://bl.ocks.org/rutgerhofste/5bd5b06f7817f0ff3ba1daa64dee629d

我想使用新比例代替旧比例的原因是,就我而言,svg 的很多部分都与比例相关。如果我只是改变旧的比例,那些绑定的事件将完美地工作。我不想回收 …

javascript d3.js

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

异步会使其内部的所有内容异步吗?

根据MDN,

异步函数声明定义了一个异步函数

我理解它,因为该函数将被视为异步过程,就像setTimeout某个数据库请求一样。例如,在下面的示例中,该过程应在数字之间的某个位置输出“ main”。

let func2 = async () => {
   for (let i = 0; i < 51; i ++) {
       console.log(i);
   }
}

(async () => {
    func2();
    console.log("main");
})()
Run Code Online (Sandbox Code Playgroud)

但是,就像整个过程是同步的一样,“ main”总是在最后被控制台。我理解错了什么?

如果同步代码仍然是同步的,那么目的是async什么?只允许await在其内部提供一些幻想的方法来返回Promise

javascript node.js async-await

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

新部署后,Angular应用必须清除缓存

我们有一个Angular 6应用程序。它在Nginx上提供。SSL已启用。

当我们部署新代码时,大多数新功能都可以正常工作,但不能进行某些更改。例如,如果前端开发人员更新并部署了服务连接,则用户必须打开隐身窗口或清除缓存以查看新功能。

哪些类型的更改不会自动更新?他们为什么与众不同?

避免该问题的常见解决方案是什么?

javascript deployment nginx angular

2
推荐指数
3
解决办法
3834
查看次数