Nodejs Express API Gateway (1)

Submitted by Lizhe on Tue, 11/20/2018 - 14:45

之前一直是用kong的, 不过最近发现了express也可以做Gateway, 参考了一下开源实现

https://www.express-gateway.io

首先是安装

$ sudo npm install -g express-gateway

然后通过下面的引导命令可以初始化一个项目

$ eg gateway create

创建结束以后你会得到一个像下面的内容

20181120024510

默认get start 项目里会带一个路由, 通过 localhost:8080/ip 指向到 https://httpbin.org/ip

node express 多线程(2)

Submitted by Lizhe on Mon, 11/19/2018 - 16:38

上一个例子中并没有使用express, 下面这个例子里将演示如何在express环境中使用cluster多线程

express使用bin文件夹下的www脚本启动http server, 所以直接修改这个脚本就可以使用cluster

app/bin/www 将此脚本的内容修改为

#!/usr/bin/env node

 

var app = require("../app");

var debug = require("debug")("app:server");

var http = require("http");

 

var cluster = require("cluster");

var numCPUs = require("os").cpus().length;

 

if (cluster.isMaster) {

node express 多线程(1)

Submitted by Lizhe on Mon, 11/19/2018 - 16:15

我们知道标准的Javascript是单线程的, 无法真正的使用多核cpu, 过去的做法是在不同的端口上启动多个相同或者不同的服务

例如如果一个服务要运行在多个核心上, 就必需使用脚本启动在多个端口上, 然后用负载均衡服务器对请求进行分发, 实现起来较为复杂

使用cluster集群api可以让单个程序充分利用多核cpu, 下面来看看步骤

首先需要安装下面两个模块

npm install --save cluster
npm install --save os

然后是实现代码

var cluster = require("cluster");

var http = require("http");

var numCPUs = require("os").cpus().length;

if (cluster.isMaster) {

  // Fork workers.

express-session

Submitted by Lizhe on Mon, 11/19/2018 - 10:57

使用express-session需要安装

npm install express-session --save

然后你可以选择在app.js中加入引用

var session = require("express-session");

接着就可以使用app.use初始化这个session对象了,初始化之后直接使用req.session就可以引用它

req.session.username = "Lizhe";

res.render("index", { title: "Express " + req.session.username });

然后这里有一个坑... 本文主要记录这个坑

var app = express();

app.use(

  session({

    secret: "secret", // 对session id 相关的cookie 进行签名

React Hooks Sample

Submitted by Lizhe on Mon, 11/12/2018 - 15:51

需要注意的是, hooks这种新玩意只能用在无状态的函数组件中

还有就是如果你使用create-react-app创建应用, 那么你需要手动修改package.json中的react和react-dom版本号, 因为目前hooks还在阿尔法版本中[🐶]

import React, { Component } from "react";

import "./App.css";

import Counter from "./Counter";

class App extends Component {

  render() {

    return (

      <div className="App">

        <Counter />

      </div>

    );

  }

TypeScript 动态加载模块

Submitted by Lizhe on Thu, 11/08/2018 - 15:42

核心方法是下面这个文件

这里要重点解释几个点

1. 方法 asyncComponent 的参数是一个名为 getComponent 的方法, 参数名是getComponent, 参数的类型是一个方法, 用  () => Promise<any> 表示

这个方法的返回值是一个Promise对象, 这个Promise可以包含任意 <any> 类型的对象

2. 这个方法的返回值是 AsyncComponent 类, 它是React.Component的子类

3. AsyncComponent 加载完成之后会在componentDidMount 中调用 (await getComponent()).default;

   getComponent() 也就是传入的参数方法, 根据参数的定义, 它一定会返回一个包含任意对象的Promise对象, 然后调用这个对象的default属性

4. render方法负责渲染这个await getComponent() 返回的Component对象

() => Promise<any> 到底是个什么鬼

Submitted by Lizhe on Wed, 11/07/2018 - 16:39

今天在项目代码里看见这么一段

export default function asyncComponent(getComponent: () => Promise<any>) {

....

}

主要懵在这个参数上

asyncComponent(getComponent: () => Promise<any>)

冒号左边 getComponent 应该是参数名

冒号右边 () => Promise<any> 应该是这个参数的类型

但是() => Promise<any>到底是个什么类型呢?

写个例子试一试

Main.ts

call, apply, bind 方法

Submitted by Lizhe on Wed, 11/07/2018 - 10:53

所有的函数都从Function.prototype中继承了call, apply 和 bind 方法

这些方法可以设置函数内部的this值

初始化

npm init -y

安装ts

npm install -g typescript ( linux 或者 mac 如果出现权限错误需要sudo )

先定义一个Student类, 包含两个属性name和age, 实际上我只使用了name

 

export class Student {

  public name: string;

  public age: Int16Array;

  public hello() {

    console.log("hello, i am " + this.name);

  }

}

关于node你应该知道的一些事

Submitted by Lizhe on Mon, 11/05/2018 - 13:44

起这么个名字主要是为了自己备忘

1. 原生node使用的是CommonJS 

2. CommonJS, TypeScript, ES6 是三种不同的Javascript

3. 通过 babel 等库, 上面这3种 Javascript都可以被编译成在浏览器端可以运行的代码

4. CommonJS里每个文件都是一个模块, 每个模块有自己的作用域, 其中的变量和方法都是私有的

5. CommonJS通过module.exports变量导出变量和方法, Node还会为每个模块提供var exports = module.exports; 所以可以直接使用exports变量

6. require 是运行时调用, 所以require理论上可以运用在代码的任何地方

7. import 是编译时调用, 所以必需放在文件开头

8. require 是赋值过程, require的结果就是对象,数字,字符串或者函数等

9. import 是解构过程, 但是目前所有的引擎都没有实现import, 所以在node中使用的ES6 import 都需要babel转为ES5代码之后才能运行