fanym's blog


  • 首页

  • 归档

  • 搜索

如何在typescript引用 .json 文件

发表于 2018-11-15

如果查找typescript引用 .json 文件大部分给出的答案是:

1、require 使用时是 a[‘xxx’],这种方式没有提示和代码检查,所以不使用。

2、typings.d.ts 添加下面这个定义:

1
2
3
4
5
declare module "*.json" {
const value:any;
export defaultv alue;

}

但我转换出的js代码是

HeroAttribute2.default.xxx ,然后报找不到default 属性。
解决方案
typings.d.ts定义改为 :

1
declare module "*.json";

引用方式改为 “* as”就可以带提示使用了。

最后以上都是瞎整,TS 2.9 新增加的属性设置就可以了,难怪没什么资料。

1
"resolveJsonModule": true,

引用:

1
import Setting = require('../shared/publicShared/config/Setting.json');

pomelo通过高阶函数实现非侵入式的自定义异常捕获

发表于 2018-09-16

背景

使用的是pomelo框架开发,项目中需要对接口自定义异常捕获处理。

方案分析

方案有三个:
1、首先想到的是在函数上层调用try catch。但是上层调用是第三方框架中,需要侵入node module改写第三方代码。
2、使用装饰器改写函数,但装饰器现在还只是es7提案,现在node还不支持这个语法。
3、使用高阶函数在构造函数中对接口方法重新定义函数。

实现

综上,我使用了第三种方案,例子如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class Test {
constructor(){
let funs = Object.getOwnPropertyNames(Test.prototype);
function fluent(fn){//高阶函数
return function(...args){
try {
fn.apply(this,args);
}
catch (e) {
console.log(e);
}
return this;
};
}
funs.forEach(item => {
if(item !== 'constructor'){
this[item] = fluent( this[item]);//重新定义函数
}
});
}

log1(){
throw 'log1';
}

log2(){
console.log('log2')
}
}
let test = new Test();
test.log1();
test.log2();

输出结果:

log1
log2

可以看到成功对类中的函数捕获异常。

由搬砖引发的思考

发表于 2018-06-22

搬砖的三个实现方案:
1、苦力搬砖,大多数人每天都是这样的,维持社会的基本运行;
2、开发自动搬砖工具,少数人可以做的,加快社会运行效率;
3、开发自动开发搬砖工具的工具,编程语言应该是比较接近这个工具实现了,从另一个角度说人就是这样一个工具,开发不了人工智能,那就用“人工”智能来替代。

node 远程调试 failed: address not available 错误处理

发表于 2018-06-06

项目远程调试是十分必要的,可以对部署在外网的环境中断点查找问题,而不用在本机上测试问题,
但调试启动:

1
node --inspect=47.52.92.163:8025 testDebug.js

报错

1
Starting inspector on 47.52.92.163:8025 failed: address not available

测试发现虽然一般都用服务器的公网ip,但这里调试需要用云服务器的内网ip(私有ip)——linux下ifconfig命令显示的ip即内网ip,才可以成功运行的.修改后可以成功调试,用0.0.0.0这个ip就可以了。

1
node --inspect=0.0.0.0:8025 testDebug.js

测试代码:

1
2
3
4
5
//testDebug.js
function test() {
console.log("test === " + Date.now());
}
setInterval(test.bind(this),1000);

mongodb传参数生成sql语句实现

发表于 2018-04-19

背景

项目由node+mongodb开发改为,java+mysql,为了方便迁移,想将mongodb传参数生成mysql对应的sql语句。

实现

具体看github

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
  strChang(obj) {
if (typeof obj === 'string') {
return "'" + obj + "'"
}
else {
return obj;
}
};

/**
* 生成sql查询语句
* @param tableName 表名
* @param query 相等查询
* @param fields 字段筛选
* @param optSql 其它sql语句
* @returns {*} promise结果返回
*/
find(tableName, query, fields, optSql) {
let fieldsKeys;
if (!fields) {
fieldsKeys = [];
}
else {
fieldsKeys = Object.keys(fields);
}
let fieldSql;
if (fieldsKeys.length === 0) {
fieldSql = '*';
}
else {
fieldSql = fieldsKeys.join(',');
}

let queryKeys = Object.keys(query);
let querySql;

if (queryKeys.length === 0) {
querySql = '';
}
else {
querySql = ' where ';
let queryArr = [];
queryKeys.forEach(key => {
let value = query[key];
switch (typeof value) {
case 'object':
let valueKeys = Object.keys(value);
valueKeys.forEach(key2 => {
switch (key2) {
case '$in'://只对in处理其它的以此类推
let arr = value[key2];
arr.forEach(index => {
if (typeof arr[index] === 'string') {
arr[index] = this.strChang(arr[index]);
}
});
queryArr.push(key + ' in (' + arr.join(',') + ')');
break;
}
});
break;
default:
value = this.strChang(value);
queryArr.push(key + ' = ' + value);
break;
}
});
querySql += queryArr.join(' and ');
}
if (!optSql) {
optSql = '';
}
else {
optSql = ' ' + optSql;
}
let sql = 'select ' + fieldSql + ' from ' + tableName + ' ' + querySql + optSql + ';';
console.log('sql : ' + sql);
return this.query(sql, []);
};

pomelo分布式部署注意

发表于 2018-02-26

官方wiki上式部署的说明:
Pomelo的分布式部署方法
基本上wiki说得挺详细了,但是没提到中心服需要可以无密码登录到子服务器上,需要做下无密码登录才行。还有pomelo用户好像不创建也可以的(以root用户运行会比较不安全)。
如果分布式部署失败可以从中心服日志上看到ssh命令失败。

失败检查:

  1. 是否可以ssh登录到子服务器,不行的话无密码登录失败。
  2. 如果可以登录检查两个路径:
    1. 项目路径不同服务器间是否一致。
    2. node命令路径是否一致,通过 which node 查看命令路径。

JS获取调用栈信息

发表于 2018-01-22

由于JS的动态类型,相比Java等强类型开发工具难以支持方法在哪调用的查找。所以为了更清晰地看到代码调用流程有必要可以输出其调用栈日志。以下是获取第三层调用栈方法。

1
2
3
4
5
var myObj = {};
Error.captureStackTrace(myObj);
var str = String(myObj.stack);
var arr = str.split("\n");//以换行为分割
console.log(arr[3]);//第三层调用调用栈存入帮助排查问题,[0]是"Error"从1开始

以上只是简单显示,可以做一个Log工具方法进行封装。一般显示两层调用栈,同时输出的日志可配合IDE点击跳转到对应位置。

pomelo对服务进程内存中变量读写

发表于 2018-01-05

背景

有时候我们需要对内存中的数据进行读写。比如以下场景:

  • 游戏逻辑变得复杂出现bug,单纯由log无法看出内存中用户数据的变化,需要直接读取内存数据分析。
  • 不影响线上玩家游戏体验,进行临时性的热更新。

实现

需要对内存数据读写具体方法参照:
pomelo-cli-exec命令使用
可以同过app的set与get方法对游戏对象设置引用,比如我的用法:

1
2
3
4
app.get("gameManager").playerEnterGame = function () {//这里app是服务进程的app对象,gameManager是在服务启动后设置下去的
return JSON.stringify(this.players);
};
result = app.get("gameManager").playerEnterGame();//这里的result 是对结果返回

以上是对gameManager对象的playerEnterGame方法进行更改。

命令记录

发表于 2017-12-20

杀死所有带关键字的进程
ps x|grep “app.js client”|grep -v grep |awk ‘{print $1}’|xargs kill -9

svn add 目录下所有文件
svn add . –no-ignore –force

svn 关联移除
svn propdel -R svn:externals

JS实现对emoji表情替换

发表于 2017-12-18

由于客户端对微信昵称包含emoji表情json解析出错要求服务端去除,以下是去除方法:

1
2
3
4
5
6
7
8
9
var a =",,🐶🐅";

var ranges = [
'\ud83c[\udf00-\udfff]',
'\ud83d[\udc00-\ude4f]',
'\ud83d[\ude80-\udeff]'
];
a = a.replace(new RegExp(ranges.join('|'), 'g'), '');
console.log(a);
上一页1234下一页

fanyingmao

32 日志
43 标签
© 2021 fanyingmao
由 Hexo 强力驱动
|
主题 — NexT.Gemini v5.1.4
人 次