标签: vapor

安装 Vapor 进行 Swift 后端开发

我刚刚开始快速后端开发。我注意到 Vapor 并安装了 swift 包管理器(Swiftenv)。我按照其说明通过以下方式安装 Vapor CLI:

wget cli.qutheory.io -O vapor
Run Code Online (Sandbox Code Playgroud)

但不断报错:

Resolving cli.qutheory.io... 138.197.255.240
Connecting to cli.qutheory.io|138.197.255.240|:80... connected.
HTTP request sent, awaiting response... 404 Not Found
2016-08-07 10:41:15 ERROR 404: Not Found.
Run Code Online (Sandbox Code Playgroud)

有人面临同样的问题吗?如何摆脱它?

我还尝试了另一种方法:

curl -L cli.qutheory.io -o vapor
Run Code Online (Sandbox Code Playgroud)

输出是:

% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    38  100    38    0     0     21      0  0:00:01  0:00:01 --:--:--    21
Run Code Online (Sandbox Code Playgroud)

然后,我运行命令:

chmod +x vapor
Run Code Online (Sandbox Code Playgroud)

进而:

sudo mv …
Run Code Online (Sandbox Code Playgroud)

swift vapor

5
推荐指数
1
解决办法
1282
查看次数

我如何阅读这个 Swift 语法?

我正在使用Vapor,第一件事就是使用 get 方法,如下所示:

drop.get("hello") { request in
    return "Hello, world!"
}
Run Code Online (Sandbox Code Playgroud)

现在我的理解是闭包就像类型函数的变量。正确的?get在这里我看到我们在名为 drop 的类实例上调用一个方法Droplet并传入一个字符串。

在 get 方法体内调用/传递闭包是怎么回事?我怎么读这个?

swift vapor

5
推荐指数
1
解决办法
676
查看次数

如何在 Vapor 中向 Firebase Cloud Messaging API 发送 POST 请求

我尝试使用 Vapor 1.5 和 Firebase 旧协议向 Firebase 通知 API 发出 POST 请求,但收到失败响应。

响应为 JSON(node: Node.Node.object(["multicast_id": Node.Node.number(5936281277445399934), "failure": Node.Node.number(0), "canonical_ids": Node.Node.number(0) ), "结果": Node.Node.array([Node.Node.object(["message_id": Node.Node.string("0:1527074314969790%c7ade8b9f9fd7ecd")])]), "成功": Node.Node 。1号)]))

编辑 通过 POSTMan 发出请求失败,并出现错误“请求缺少身份验证密钥(FCM 令牌)”。

class FirebaseRequester {
 let fcmLegacyServerKey = "AIzaSyDSuXXXXXXkCafTQay5_r8j3snvVos"

 func sendNotification(payLoad: JSON) throws -> Response {

    var response: Response?
    do {
        let responseFCM = try drop.client.post("https://fcm.googleapis.com/fcm/send", 
           headers: ["Content-Type":"application/json","Authorization": "key\(fcmLegacyServerKey)"], 
           query: [:], 
          body: payLoad.makeBody())

        response = responseFCM

    }catch let error {
        let message = error.localizedDescription
        logErr.prints(message: message)
        throw Abort.custom(status: .badRequest, message: …
Run Code Online (Sandbox Code Playgroud)

firebase vapor firebase-cloud-messaging

5
推荐指数
1
解决办法
3965
查看次数

Swift - POST 请求,使用 Vapor 3 发送 JSON

我在使用 Vapor 3 发送正文包含 JSON 的 POST 请求时遇到问题。我正在使用https://docs.postman-echo.com/来测试它,它使用发送的相同 JSON 进行响应。

我已查看此处的答案,但在编码和内容类型方面出现错误。

router.get("hooray") { req -> Future<View> in

  var postHeaders: HTTPHeaders = .init()
  postHeaders.add(name: .contentType, value: "application/json")
  postHeaders.add(name: .accept, value: "*/*")
  postHeaders.add(name: .acceptEncoding, value: "gzip, deflate")

  let oneField = singleGet(foo: "barfoobar")

  // { foo: "barfoobar" } - JSON string

  let encoder = JSONEncoder()
  encoder.outputFormatting = .prettyPrinted

  let jsonData = try encoder.encode(oneField)
  let jsonString = String(data: jsonData, encoding: .utf8)!
  let postBody = HTTPBody(string: jsonString)

  let httpReq = HTTPRequest(method: …
Run Code Online (Sandbox Code Playgroud)

json http swift vapor

5
推荐指数
0
解决办法
946
查看次数

如何帮助 Vapor 成功与我的 PostgreSQL 服务器进行 SSL 握手?

我在 Ubuntu 服务器上使用 Vapor 连接到我的 DigitalOcean 管理的 PostgreSQL 数据库。

从命令行,运行以下命令可以正常工作:

psql postgresql://user:password@host:port/dbname?sslmode=require
Run Code Online (Sandbox Code Playgroud)

但是使用以下代码运行等效内容会给出:

Fatal error: Error raised at top level: NIOOpenSSL.NIOOpenSSLError.handshakeFailed(NIOOpenSSL.OpenSSLError.sslError([Error: 337047686 error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed])): file /home/buildnode/jenkins/workspace/oss-swift-5.1-package-linux-ubuntu-18_04/swift/stdlib/public/core/ErrorType.swift, line 200
Run Code Online (Sandbox Code Playgroud)

这是代码:

psql postgresql://user:password@host:port/dbname?sslmode=require
Run Code Online (Sandbox Code Playgroud)

将传输参数切换为.unverifiedTLS有效。

我需要帮助才能让 Vapor 正常建立 SSL 连接,但我不知道从哪里开始。

postgresql ssl swift vapor vapor-fluent

5
推荐指数
1
解决办法
1036
查看次数

了解如何初始化 Vapor 4 存储库

我正在尝试使用 Repository 模式将一些代码从 Vapor 3 迁移到 Vapor 4。我已经阅读了 Vapor 4文档中有关此特定模式的文档,我想我对它的大部分了解。

然而,我没有得到的一件事是在Application扩展中设置存储库工厂的方式。文档中的示例显示了这一点:

extension Application {
    private struct UserRepositoryKey: StorageKey { 
        typealias Value = UserRepositoryFactory 
    }

    var users: UserRepositoryFactory {
        get {
            self.storage[UserRepositoryKey.self] ?? .init()
        }
        set {
            self.storage[UserRepositoryKey.self] = newValue
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我正确阅读了 getter 方法(我可能不是 - 我离 Swift 专家还很远),UserRepositoryFactory将创建一个新的结构实例并在app.users引用时返回。但是,当时似乎没有self.storage[UserRepositoryKey.self]以任何方式更改的内容。因此,如果我碰巧app.users连续访问两次,我会得到 2 个不同的实例返回给我,并且self.storage[UserRepositoryKey.self]将保持设置为nil.

按照文档中的其余示例代码,它似乎定义make了工厂在配置应用程序时将使用的函数,如下所示:

app.users.use { req in
    DatabaseUserRepository(database: req.db)
}
Run Code Online (Sandbox Code Playgroud)

这里似乎 …

vapor vapor-fluent

5
推荐指数
1
解决办法
251
查看次数

如何生成用于不记名令牌的加密安全随机数?

我想生成一个安全的随机数,用于 Vapor Swift 中的不记名令牌。

我看过OpenCrypto但它似乎无法生成随机数。

我该怎么做呢?

random cryptography swift vapor

5
推荐指数
2
解决办法
1735
查看次数

枚举给出了 Vapor 4 和 Fluent 的错误

这让我很困惑:

\n

我有一个模型,我想在其中使用枚举。我首先声明枚举:

\n
enum MenuChoices: String, Codable {\n    case reachableAt\n    case attentionTo\n    case reasonVisit\n    case reasonProblem\n}\n
Run Code Online (Sandbox Code Playgroud)\n

然后是我的班级领域:

\n
@Enum(key: "menu_choices")\nvar menuChoices: MenuChoices\n
Run Code Online (Sandbox Code Playgroud)\n

然后我使用迁移在数据库中创建它:

\n
struct CreateUserMenu: Migration {    \nfunc prepare(on database: Database) -> EventLoopFuture<Void> {\n    return database.enum("menu_choices")\n        .case("reachable_at")\n        .case("attention_to")\n        .case("reason_visit")\n        .case("reason_problem")\n        .create()\n        .flatMap { menu_choices in\n            return database.schema("user_menus")\n                .id()\n                .field("created_at", .datetime, .required)\n                .field("updated_at",.datetime, .required)\n                .field("deleted_at",.datetime)\n                .field("menu_choices", menu_choices)\n                .field("be_nl", .string)\n                .field("be_fr", .string)\n                .field("en_us", .string)\n                .create()\n        }\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

到目前为止,一切都很好。此迁移有效并且数据库看起来正常。但是当我想添加一些数据以在另一个迁移中为数据库提供种子时,我收到错误:

\n
let test = UserMenu( menuChoices: MenuChoices.reachableAt, beNl: "nl", …
Run Code Online (Sandbox Code Playgroud)

enums vapor vapor-fluent

5
推荐指数
1
解决办法
952
查看次数

Swift 编译器可以为我的应用程序创建单个可执行文件吗?

我目前正在尝试为我的 Vapor 应用程序创建一个可执行文件,但我无法在我的服务器上运行它。

我的期望是它能够使用我的所有代码和依赖项创建一个应用程序。我当前的参考文献是 .NET 和 Go,您可以在其中从代码创建单个可执行文件并部署此独立文件 - 这使得部署非常简单。

我尝试在 Docker 上编译并执行它,但没有那么幸运 - 它失败了,因为缺少一些 libSwift 东西。

那么,Swift 可以做这样的事情吗?

期待您的答复

swift vapor

5
推荐指数
1
解决办法
1694
查看次数

在 Vapor 4 中的文件流之后运行操作

我运行一个处理大文件(上传和下载)的网站。目前我正在将网站从 Perfect 过渡到 Vapor。在 Perfect 中,将文件流式传输给用户,然后在文件完成后执行一些操作相对简单。

我试图在 Vapor 中做同样的事情,但我似乎无法弄清楚如何在流完成时设置回调,以及当它完成时,它是否完全被用户下载或有中断。

有谁知道如何做到这一点?这是我尝试过的一些事情。

这是基本结构

func downloadFile(request: Request) -> EventLoopFuture<Response> {
    //do some authentication stuff here
    
    let promise = request.eventLoop.makePromise(of: Response.self)
    let response = request.fileio.streamFile(at: "somePath")
    promise.succeed(response)
    let future = promise.futureResult
    return future
}
Run Code Online (Sandbox Code Playgroud)

第一次修改

func downloadFile(request: Request) -> EventLoopFuture<Response> {
    //do some authentication stuff here
    
    let promise = request.eventLoop.makePromise(of: Response.self)
    let response = request.fileio.streamFile(at: "somePath")
    promise.succeed(response)
    let future = promise.futureResult
    
    future.eventLoop.next().execute {
        //run some post-download processing here.
        //ideally I would like to know …
Run Code Online (Sandbox Code Playgroud)

swift vapor server-side-swift swift-nio

5
推荐指数
1
解决办法
118
查看次数