如何使用 Swift-Nio 连接到 MySQL 数据库

How to Connect to MySQL datbase using Swift-Nio

我使用节点 js 连接 mysql 服务器并且运行良好。我用的是node js开发的API,在本地macOS app中使用。问题是在 workbench 上从 mysql 数据库查询数据很快,但在节点 js API 中查询数据非常延迟。所以,我必须直接从我的 macOS 应用程序连接 mysql 数据库。

我从这里安装了 mysql:https://www.mysql.com/downloads/

另外,我正在使用 mysql 工作台测试连接,并且连接没有任何问题。因此,在系统首选项中,我有一个 mysql 扩展来启动和停止 mysql 服务器。在扩展中,我可以看到根文件夹位于 /usr/local/mysql

我创建了新项目并添加了 mysql-nio from here

的 swift 包

在该存储库中,他们的 API 文档 link 已损坏 https://api.vapor.codes/mysql-nio/master/MySQLNIO/ But I found the correct link https://api.vapor.codes/mysql-nio/main/MySQLNIO/MySQLConnection/

通过使用 link,我尝试连接以下代码,

//https://github.com/vapor/mysql-nio

import Cocoa
import MySQLNIO

class ViewController: NSViewController {

    
    private var group: EventLoopGroup = MultiThreadedEventLoopGroup(numberOfThreads: 4)
     
    private var eventLoop: EventLoop {

        return self.group.next()
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
   
        do{
            
            let socketAddress = try SocketAddress(ipAddress: "127.0.0.1", port: 3306)
            
            let logger = Logger(label: "MyLogger")
            let connection = MySQLConnection.connect(to: socketAddress, username: "root", database: "MyDB", password: "3$@sdRt34@sdf$dja2", tlsConfiguration: nil, serverHostname: nil, logger: logger, on: eventLoop)                
            connection.whenComplete { result in
                
                switch result{
                    
                case .success(let connection):
                    
                    print("Success! Status closed: \(connection.isClosed)")
                    
                case .failure(let error):
                     
                    DispatchQueue.main.async {
                        
                        NSApp.presentError(error)
                    }
                }
            }
            
        }catch{
            
            NSApp.presentError(error)
        }
        
    }
}

错误:

The operation couldn’t be completed. (NIOCore.IOError error 1.)

我在 xcode 项目 info

中添加了 App Transport Security Settings -> Allow Arbitrary LoadsYES

我不知道如何解决这个问题。你能帮我解决这个问题吗?谢谢!

在应用沙箱中,您需要启用“传出连接(客户端)”,然后它应该可以工作。

不幸的是,由于 Swift bug,如果您执行 localizedDescription,Swift 错误的错误打印输出实际上没有用。要查看实际错误,您需要在错误处理程序中放入类似 print(error) 的内容。

看看下面的屏幕截图,如果我不检查“传出连接(客户端)”,print(error) 会打印出实际有用的文本,例如 connect(descriptor:addr:size:): Operation not permitted (errno: 1)