Candinya / nyalink.js

A Node.JS middleware connecting VPN Panels with backend servers.
GNU General Public License v3.0
8 stars 4 forks source link

对接报错,好像是get不到userID什么的 #2

Closed hulisang closed 3 years ago

hulisang commented 3 years ago

环境debian10,node15

一步步按要求操作后报错

root@debian:~/nyalink.js# node nyalink.js file:///root/nyalink.js/nyalink.js:78 panelUsers.forEach((u, pos) => { ^

TypeError: Cannot read property 'forEach' of null at getUserId (file:///root/nyalink.js/nyalink.js:78:16) at file:///root/nyalink.js/nyalink.js:114:24 at Array.forEach () at backendUserListCallback (file:///root/nyalink.js/nyalink.js:113:21) at ClientReadableStream. (file:///root/nyalink.js/nyalink-grpc.js:33:13) at ClientReadableStream.emit (node:events:327:20) at endReadableNT (node:internal/streams/readable:1289:12) at processTicksAndRejections (node:internal/process/task_queues:80:21)

Candinya commented 3 years ago

怀疑可能是webapi请求的结果中data段出现了问题,我是按照手动测试获得的sspanel的返回格式构造的,默认使用了HTTPS协议(硬编码在nyalink-webapi.js文件的第10行,可能有必要修改一下),因而在样例配置中仅保留了域名,不知道是否有可能是因为协议导致的问题。 开发时候使用的返回结果提供在下面了,如果并不是请求协议问题的话,能否麻烦您手动进行一次对于面板API的请求(//面板地址/mod_mu/users?node_id=*节点ID*&key=*MuKey*),以便于发现可能存在的兼容性问题,非常感谢狐狸大佬的帮助!

{
  "ret": 1,
  "data": [{
    "id": 1,
    "email": "user@example.com",
    "passwd": "******",
    "uuid": "******",
    "u": 0,
    "d": 0,
    "port": 1025,
    "method": "rc4-md5",
    "node_speedlimit": 0,
    "node_connector": 0,
    "protocol": "origin",
    "protocol_param": null,
    "obfs": "plain",
    "obfs_param": null,
    "forbidden_ip": null,
    "forbidden_port": null,
    "disconnect_ip": null,
    "is_multi_user": 0,
    "sha224uuid": "******"
  }]
}
hulisang commented 3 years ago

感谢大佬的思路,不知道是不是面板的bug,经排查节点类型为trojan时,设置节点流量上限为非0值,api返回就会返回空值,{"ret":1,"data":null}

Candinya commented 3 years ago

可能确实是面板存在些许bug,可以尝试检查一下面板那边有没有相关的报错信息,或是新的修复相关呢。 有任何新发现的话,欢迎随时跟进哦。

hulisang commented 3 years ago

然后又出现了。。。新的错误failed to connect to all addresses,没有找到events.js:292诶

root@debian:~/nyalink.js# node nyalink.js events.js:292 throw er; // Unhandled 'error' event ^

Error: 14 UNAVAILABLE: failed to connect to all addresses at Object.exports.createStatusError (/root/nyalink.js/node_modules/grpc/src/common.js:91:15) at ClientReadableStream._emitStatusIfDone (/root/nyalink.js/node_modules/grpc/src/client.js:233:26) at ClientReadableStream._receiveStatus (/root/nyalink.js/node_modules/grpc/src/client.js:211:8) at Object.onReceiveStatus (/root/nyalink.js/node_modules/grpc/src/client_interceptors.js:1277:15) at InterceptingListener._callNext (/root/nyalink.js/node_modules/grpc/src/client_interceptors.js:568:42) at InterceptingListener.onReceiveStatus (/root/nyalink.js/node_modules/grpc/src/client_interceptors.js:618:8) at /root/nyalink.js/node_modules/grpc/src/client_interceptors.js:1033:24 Emitted 'error' event on ClientReadableStream instance at: at ClientReadableStream._emitStatusIfDone (/root/nyalink.js/node_modules/grpc/src/client.js:234:12) at ClientReadableStream._receiveStatus (/root/nyalink.js/node_modules/grpc/src/client.js:211:8) [... lines matching original stack trace ...] at /root/nyalink.js/node_modules/grpc/src/client_interceptors.js:1033:24 { code: 14, metadata: Metadata { _internal_repr: {}, flags: 0 }, details: 'failed to connect to all addresses' }

Candinya commented 3 years ago

event.js也许是grpc中提供的呢,这个大概是和trojan-go的gRPC连接建立不成功导致的…?因为我没有检测后端的连通性,所以大概连接失败的话也就会报错啦x 这边连接的后端是trojan-go哦,不是原始的trojan-gfw那个(那个似乎只能用MySQL数据库连接?trojan-go实现了gRPC协议的API(不过需要在配置中手动设置为开启),所以这边是使用这个API进行操作的。) 以及暂时比较偷懒,所以gRPC那边配置的是无加密的API连接模式,之后如果有加密相关的需求的话也许可以配置相关的加密方式呢。 这里附上一份我目前部署使用的trojan-go的配置文件,希望能有所帮助呢w

{
    "run_type": "server",
    "local_addr": "0.0.0.0",
    "local_port": 18771,
    "remote_addr": "127.0.0.1",
    "remote_port": 8080,
    "password": [
        "default_password"
    ],
    "ssl": {
        "cert": "/var/ssl/cert.crt",
        "key": "/var/ssl/key.key",
        "sni": "example.nyawork.com"
    },
    "router": {
        "enabled": true,
        "block": [
            "geoip:private"
        ],
        "geoip": "./geoip.dat",
        "geosite": "./geosite.dat"
    },
    "api": {
        "enabled": true,
        "api_addr": "127.0.0.1",
        "api_port": 10001,
        "ssl": {
            "enabled": false,
            "key": "",
            "cert": "",
            "verify_client": false,
            "client_cert": []
        }
    }
}
hulisang commented 3 years ago

感谢提供配置文件,之前用的trojan的配置文件(只是加了api那一段)。今天重装系统之后用了您的配置文件一次点亮且正常运行,功能正常。ps:之前api返回空是因为设置的节点流量上限小于已用流量,清空数据后正常返回 再次感谢大佬的中间件,我会一直陪伴测试(^▽^)

Candinya commented 3 years ago

好哒!也非常感谢大佬的帮助呢!辛苦啦~ (◍•ᴗ•◍)