hkoos

hkoos 查看完整档案

郑州编辑  |  填写毕业院校  |  填写所在公司/组织 hkoos.com 编辑
编辑
_ | |__ _ _ __ _ | '_ \| | | |/ _` | | |_) | |_| | (_| | |_.__/ \__,_|\__, | |___/ 个人简介什么都没有

个人动态

hkoos 赞了回答 · 2020-12-24

解决GO 关于结构体使用的问题

看这个报错信息是因为 test1 这个接口没有实现 error 这个接口

增加一下实现代码就行了


func (t *test1) Error() string{
    // 自定义错误信息
    return fmt.Sprintf("code %d: %s", t.Code, t.Message)
}

关注 2 回答 1

hkoos 提出了问题 · 2020-12-24

解决GO 关于结构体使用的问题

在写一个Golang项目,一个方法中有一个返回值,如下:

func jwtErrorHandler(err error) error {
    return &echo.HTTPError{
        Code:     http.StatusUnauthorized,
        Message:  "invalid or expired jwt1",
        Internal: err,
    }
}

其中 &echo.HTTPError 点进去之后,是echo中的一个结构体:

// HTTPError represents an error that occurred while handling a request.
    HTTPError struct {
        Code     int
        Message  interface{}
        Internal error // Stores the error returned by an external dependency
    }

我现在不想使用echo中的结构体,想用我自己的结构体,但是替换之后却报错,我自己的结构体如下:

type test1 struct {
    Code     int
    Message  interface{}
    Internal error // Stores the error returned by an external dependency
}

替换后如下:

func jwtErrorHandler(err error) error {
    return &test1{
        Code:     http.StatusUnauthorized,
        Message:  "invalid or expired jwt1",
        Internal: err,
    }
}

出现如下报错:

cannot use &test1 literal (type *test1) as type error in return argument:
    *test1 does not implement error (missing Error method)

image.png

希望大佬帮忙解答,小弟不胜感激!


感谢@管大侠的回答,我自己的结构体确实没实现Error()方法,但是实现之后目前又出现了一个问题,如下:

在我使用echo.HTTPError这个结构体的时候,是可以正常返回的

func jwtErrorHandler(err error) error {
    return &echo.HTTPError{
        Code:     http.StatusUnauthorized,
        Message:  "invalid or expired jwt1",
        Internal: err,
    }
}

image.png

echo日志输出如下:

image.png

但是使用自己的结构体之后,无法正常返回了,如下图所示:

func jwtErrorHandler(err error) error {
    return &test1{
        Code:     http.StatusUnauthorized,
        Message:  "invalid or expired jwt2",
        Internal: err,
    }
}

PostMan输出如下

image.png

echo日志输出如下:

image.png

可以看到日志中的错误信息确实为结构体中定义的invalid or expired jwt2,但是直接在内部被拦截了,并没有正确返回给客户端,本人初学Echo,不太清楚这个是自己结构体写法问题,还是Echo内部的机制,这个可能是有哪些问题导致的呢?

关注 2 回答 1

hkoos 发布了文章 · 2020-12-13

Vue+Electron项目简洁快速搭建教程

Vue+Electron项目搭建教程

最近写一个项目,需要使用Electron集成Vue,特此记录搭建过程

Vue+Electron 常用搭建方式

在之前,通常我们会使用electron-vue脚手架来快速搭建,但是这个脚手架搭建的Electron版本已经太旧了,目前github已经一年没提交更新了,所以我们需要使用其他新的方式来搭建。

Vue CLI Plugin Electron Builder

本教程使用Vue CLI Electron插件,快速的搭建Electron+Vue项目,关于插件的信息可进入Vue CLI Plugin Electron Builder官网自行了解,下面我们开始搭建

开始搭建

1:使用Vue脚手架创建Vue项目

1. 安装Vue脚手架,若已安装则可以跳过,未安装可用如下方式安装
npm install -g @vue/cli
# OR
yarn global add @vue/cli
2. 创建项目
# 下方 myproject 为项目名,可自己定义
vue create myproject

执行之后,出现如下选项:

其实就是默认配置和自定义配置,主要是代码检查、语言(js or ts)、路由、CSS(Scss等)等等...,我这边直接选择default,如果有特殊需求你可以自定义设置

Vue脚手架模式选择

如图,安装完成,我这边安装的有yarn,所以vue默认用yarn作包管理了,如果你使用的npm或cnpm,使用npm run serve 运行即可

Vue安装完成

2.配置Electron

接下来就开始配置Electron了

首先进入项目目录
cd myproject
然后通过运行以下命令安装并调用vue-cli-plugin-electron-builder的生成器:
vue add electron-builder

如下图所示,提示我们选择Electron版本,直接选择最新9.0.0版本即可

选择Electron版本

接下来根据您的网络情况,安装时间各异,一般为15-60秒左右,安装成功后如下提示:

Electron安装成功

启动
如果您使用yarn(强烈推荐),则直接执行
yarn electron:serve
或者,如果您使用NPM,则执行:
npm run electron:serve

启动成功


到此为止,整合完毕启动成功,整体还是比较简单的,感谢脚手架大佬们的贡献者,方便了像我这样的搬砖者,向大佬们学习,向大佬们致敬!

如果您安装过程中遇到了问题,欢迎留言,我看到会尽量及时回复,若有需要,接下来我会再写一遍关于Electron简单入门的教程

查看原文

赞 0 收藏 0 评论 0

hkoos 关注了用户 · 2020-12-13

FrankChencc @frankchencc

关注 7

hkoos 提出了问题 · 2020-12-13

stream流复制之后write方法无法使用

\#\#\# 问题描述

一个方法的回调中,有一个stream流,我想把这个流赋值到全局对象,但是赋值后无法使用了,只能在当前作用域里使用

\#\#\# 相关代码

initSSH() {
      const { Client } = window.require("ssh2");
      const conn = new Client();
      conn.on("ready", () => {
          console.log("Client :: ready");
          conn.shell((err, stream) => {
            if (err){
              this.term.write(err)
              conn.end()
            }
            console.log("stream",stream)
            // 这里把stream赋值给this.sshClientStream后 无法使用
            this.sshClientStream = stream;
            stream
              .on("close", () => {
                console.log("Stream :: close");
                conn.end();
              })
              .on("data", (data) => {
                // console.log("OUTPUT: " + data);
                this.term.write(data);
                this.term.scrollToBottom();
              });
            this.bindTermOnKey()
          });
        })
        
      conn.connect({
          host: "127.0.0.1",
          port: 12,
          username: "root",
          password: "root",
      });
    },

    bindTermOnKey(){
      console.log("sshClientStream",this.sshClientStream)
      this.term.onKey((e) => {
        console.log(e);
        console.log(e.key);
        this.sshClientStream.cork();
        this.sshClientStream.write(e.key);
        this.sshClientStream.uncork();
      });
    },

\#\#\# 你期待的结果是什么?实际看到的错误信息又是什么?
在其他方法中使用this.sshClientStream.write(xxx)直接报错

image.png

打印了赋值前后对stream进行对比,发现赋值前是Channel,赋之后this.sshClientStream变成了Proxy

调用write错误信息如下

internal/crypto/cipher.js:157 Uncaught TypeError: Illegal invocation
    at Proxy.update (internal/crypto/cipher.js:157)
    at send_ (/Users/shishuaibiao/Documents/文稿 - 时帅彪的MacBook Pro/ElectronProjects/okshell/okshell/node_modules/_ssh2-streams@0.4.10@ssh2-streams/lib/ssh.js:5047)
    at send (/Users/shishuaibiao/Documents/文稿 - 时帅彪的MacBook Pro/ElectronProjects/okshell/okshell/node_modules/_ssh2-streams@0.4.10@ssh2-streams/lib/ssh.js:4961)
    at Proxy.SSH2Stream.channelData (/Users/shishuaibiao/Documents/文稿 - 时帅彪的MacBook Pro/ElectronProjects/okshell/okshell/node_modules/_ssh2-streams@0.4.10@ssh2-streams/lib/ssh.js:969)
    at Proxy.Channel._write (/Users/shishuaibiao/Documents/文稿 - 时帅彪的MacBook Pro/ElectronProjects/okshell/okshell/node_modules/_ssh2@0.8.9@ssh2/lib/Channel.js:347)
    at doWrite (_stream_writable.js:435)
    at clearBuffer (_stream_writable.js:574)
    at Proxy.Writable.uncork (_stream_writable.js:329)
    at eval (HelloWorld.vue?fdab:108)
    at e.fire (xterm.js?7243:1)

关注 3 回答 1

hkoos 提出了问题 · 2020-07-11

关于TCP三次握手和四次挥手的问题

TCP建立连接需要经历三次握手,断开连接需要四次挥手,为什么我抓包,断开连接时只挥了三次手呢?

点击建立连接之后,经历了三次握手,这个没问题

image.png

现在点击断开连接,如下图,只发了三个包,正常情况下不应该是4个包吗?

image.png

关注 2 回答 1

hkoos 提出了问题 · 2020-05-10

nginx提示域名配置重复如何解决

logs/error.log:1070958:2020/05/07 09:31:17 [warn] 29552#0: conflicting server name "suichen.xiaomy.net" on 0.0.0.0:443, ignored

image.png

但是我查了所有配置文件,确实没有重复的

image.png

跪求大佬解决

关注 1 回答 0

hkoos 提出了问题 · 2019-12-23

Centos端口限速

大佬们好,想写个sh脚本,对Centos10000:50000之间的端口限速128kb/s,但是查了一翻资料上手捯饬了半天还是不行,求助大佬们帮忙!

关注 1 回答 0

hkoos 提出了问题 · 2019-10-22

QT/C++ Socket如何创建多个连接

用Qt写了一个Tunnel类,每次new这个类,构造函数都会socket连接到服务器,并与服务器保持通讯。

但是现在有个问题:每次new这个类,之前new的类里面的socket就会断开,我new了第一个,是正常的,new第二个,第一个类里面的socket就会断开,以此类推,ne十个,只有最后一个连接会是正常的,求大神帮忙看下,代码如下:

我是这样new的:

for(int i=0;i<=10;i++){
    Tunnel *t=new Tunnel();
    t->init(ExternData::userid,itemData.tunnelid,ExternData::token,itemData.server_ip,itemData.local_port,itemData.client_local);
    t->startTunnel();
}

tunnel.h

#ifndef TUNNEL_H
#define TUNNEL_H

#include <QByteArray>
#include <QTcpSocket>
#include <QJsonDocument>
#include <QJsonParseError>
#include <QFile>
#include <QJsonObject>
#include <QDebug>
#include <QJsonArray>
#include <QDebug>
#include <baseutility.h>
#include <packet.h>
#include <readwritetunnel.h>
#include <QMouseEvent>
#include <QObject>

class Tunnel : public QObject
{
    Q_OBJECT
public:
    Tunnel();
    void init(int userid1,int id1,QString token1,QString server_ip1,int local_port1,QString local_ip1);

    QByteArray qba;

    bool startTunnel();


private slots:

    void ClientRecvData();

private:
    QTcpSocket* socket;//创建socket对象

};





#endif // TUNNEL_H

tunnel.cpp

#include "tunnel.h"



int userid;
int id;
QString token;
QString server_ip;
int local_port;
QString local_ip;

Packet *p2;



Tunnel::Tunnel(){

}

void::Tunnel::init(int userid1,int id1,QString token1,QString server_ip1,int local_port1,QString local_ip1)
{
    userid=userid1;
    id=id1;
    token=token1;
    server_ip=server_ip1;
    local_port=local_port1;
    local_ip=local_ip1;

    p2=new Packet();
    socket=new QTcpSocket(this);
}


bool Tunnel::startTunnel()
{
    socket=new QTcpSocket();
    //QString ip="127.0.0.1";
    int port=8888;

    socket->connectToHost(server_ip,port);

    if(!socket->waitForConnected(3000)){
        //QMessageBox::information(this,"QT网络通信","连接服务器失败");
        return false;
    }
    //QMessageBox::information(this, "QT网络通信", "连接成功");

    QJsonObject json;
    json.insert("userid", userid);
    json.insert("token",token);
    json.insert("id", id);
    json.insert("type", "LOGIN");


    connect(socket,SIGNAL(readyRead()),this,SLOT(ClientRecvData()));


    Packet *p1=new Packet(json,QString("login").toLatin1());
    p1->Send1(socket);

    return true;
}


void Tunnel::ClientRecvData(){

    //这个是我自己写的packet类,用来解析服务器传过来的数据的
    QByteArray data =p2->unPacket(socket,server_ip,local_port,local_ip);

    if(data.isNull()){
        return;
    }

}

关注 2 回答 1

hkoos 赞了回答 · 2019-08-24

解决关于Mysql主从和读写分离的问题

主要是隔离读和写,让读不影响写,这样尽最大努力防止在线业务受影响。另一方面,面对读多写少的场景,水平扩展读性能。

关注 5 回答 4

认证与成就

  • 获得 0 次点赞
  • 获得 8 枚徽章 获得 0 枚金徽章, 获得 0 枚银徽章, 获得 8 枚铜徽章

擅长技能
编辑

开源项目 & 著作
编辑

(゚∀゚ )
暂时没有

注册于 2018-12-29
个人主页被 349 人浏览