我可以使用计时器,例如NSTimer在Vapor(服务器端Swift)中吗?
我希望用Vapor编写的服务器可以偶尔主动执行一些任务.例如,每15分钟从网上轮询一些数据.
如何用Vapor实现这一目标?
我试图确定使用 Network.framework 时 UDP 客户端何时停止向服务器发送数据包
我构建了一个小示例,演示服务器在.cancelled客户端连接取消时无法更改状态。
客户端示例:
import Foundation
import Network
func sendMessage(on connection: NWConnection) {
connection.send(content: "hello".data(using: .utf8), completion: .contentProcessed({error in
if let error = error {
print("error while sending hello: \(error)")
return
}
connection.receiveMessage {data, context, isComplete, error in
if let error = error {
print("error while receiving reply: \(error)")
return
}
connection.cancel()
}
}))
}
var connection: NWConnection = {
let connection = NWConnection(
to: .service(
name: "Hello",
type: "_test._udp",
domain: "local",
interface: nil
), …Run Code Online (Sandbox Code Playgroud) 如何在带有HTTPRequest结构的Vapor 3中发送API请求?
我尝试了以下代码的变体..
var headers: HTTPHeaders = .init()
let body = HTTPBody(string: a)
let httpReq = HTTPRequest(
method: .POST,
url: URL(string: "/post")!,
headers: headers,
body: body)
let httpRes: EventLoopFuture<HTTPResponse> = HTTPClient.connect(hostname: "httpbin.org", on: req).map(to: HTTPResponse.self) { client in
return client.send(httpReq)
}
Run Code Online (Sandbox Code Playgroud)
编译错误 Cannot convert value of type '(HTTPClient) -> EventLoopFuture<HTTPResponse>' to expected argument type '(HTTPClient) -> _'
我尝试了其他有效的代码变体。
let client = try req.make(Client.self)
let response: Future<Response> = client.get("http://example.vapor.codes/json")
Run Code Online (Sandbox Code Playgroud)
我阅读并重新阅读:
学习新技术是一个耗时的过程。它适用于带有 Java 的 Android。这又是针对带有 Swift 的 iOS 的。我现在面临着需要为 Android 和 iOS 应用程序提供服务器后端的挑战。但是,如果可能的话,我想避免学习一门新语言的大量时间投入。据我所知,服务器代码可以用 Java 或 Swift 编写,但 Swift 似乎是一种更简洁的语言,所以这就是我选择走这条路的原因。
我想制作一个概念验证示例,其中运行 Swift 的服务器能够与 Android 和 iOS 应用程序进行通信。应用程序发送请求并接收响应。
这个问题和我在下面的回答是我对服务器端 Swift 的介绍。
Ruby的Pathname.relative_path_from文档.
在objc中已经有KSFileUtilities的ks_stringRelativeToURL方法,非常接近.我正在寻找可以在Linux上运行的纯粹快速解决方案.
我更喜欢使用file://URL的解决方案,但String也很好.
文件系统可以区分大小写/不区分大小写.确定相对路径可能很棘手.
输入和预期输出的示例:
| Long Path | Relative to Path | Return Value |
|--------------------------------|------------------|-------------------|
| /usr/X11/agent/47.gz | /usr/X11 | agent/47.gz |
| /usr/share/man/meltdown.1 | /usr/share/cups | ../man/meltdown.1 |
| file:///var/logs/x/y/z/log.txt | file:///var/logs | x/y/z/log.txt |
Run Code Online (Sandbox Code Playgroud)
Swift已经有了FileManager.getRelationship(_:of:in:toItemAt :),但它没有返回相对路径.
我有一个路由处理程序,它为我的登录页面返回一个 Future,定义如下:
func boot(router: Router) throws {
let authSessionRoutes = router.grouped(User.authSessionsMiddleware())
authSessionRoutes.get("/login", use: loginHandler)
}
func loginHandler(_ req: Request) throws -> Future<View> {
return try req.view().render("loginPage")
}
Run Code Online (Sandbox Code Playgroud)
当用户未连接时,这很有效,但我想添加逻辑,以便任何尝试访问此页面的经过身份验证的用户都将被重定向到他们的主页。
这是我尝试过的:
func loginHandler(_ req: Request) throws -> Future<View> {
if let _ = try req.authenticated(User.self) {
return req.redirect(to: "/") <<< Cannot convert return expression of type 'Response' to return type 'EventLoopFuture<View>'
}
return try req.view().render("loginPage")
}
Run Code Online (Sandbox Code Playgroud)
这告诉我,由于我的 loginHandler 应该返回 a Future<View>,因此返回 aResponse不符合方法的定义。
处理这种情况的最佳方法是什么?
编辑 :
谢谢你的回答 !我的最终代码如下所示:
func loginHandler(_ …Run Code Online (Sandbox Code Playgroud) 配置:
蒸气 4 | 更新测试版和软件包 | macOS Catalina v.10.15.3 | XCode 11.4 测试版 2 | 引导 CDN 4.4.1
我无法切换导航栏按钮。我不确定这是否是 Leaf 中的错误。我已经按照正确的顺序实现了 Bootstrap 和 CSS。尝试运行此代码。不要忘记将浏览器窗口的大小调整为移动或平板电脑视图以显示导航栏切换按钮。这是我的叶子代码:
// 基.叶
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<meta name="viewport" content="user-scalable=no, width=device-width, initial-scale=1.0"/>
<meta name="apple-mobile-web-app-capable" content="yes" />
<!-- <link rel="stylesheet" href="/styles/bootstrap.min.css"/>-->
<link rel="stylesheet" href="/fonts/fa/css/all.min.css"/>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">
<link rel="stylesheet" href="/styles/main.css"/>
<link rel="stylesheet" href="/styles/header.css"/>
<link rel="stylesheet" href="/styles/footer.css"/>
<title>#(metaContent.title)</title>
<meta name="description" content="#(metaContent.description)"/>
</head>
<body>
<header>
<nav class="navbar navbar-expand-md navbar-dark fixed-top bg-dark">
<a class="navbar-brand" href="#">Carousel</a>
<button …Run Code Online (Sandbox Code Playgroud) 我运行一个处理大文件(上传和下载)的网站。目前我正在将网站从 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) 我有一个我正在处理的项目,它有Posts和Comments。我使用外键 (postId) 将评论链接到帖子。但是,直到我第一次使用 Comment 类构建项目之后,这个外键才被添加到我的 Comment 类中。
将该postId字段添加到注释类后,我尝试运行该项目并创建注释。该项目构建并运行良好,但是当我尝试创建评论时,出现错误:table Comment has no column named postId
这是 Vapor 中的某种迁移问题吗?
我目前正在努力使用蒸汽/流利进行更新。我有一个这样的模型:
struct DeviceToken: PostgreSQLModel {
var id: Int?
var token: String
var updatedAt: Date = Date()
init(id: Int? = nil, token: String, updatedAt: Date = Date()) {
self.id = id
self.token = token
self.updatedAt = updatedAt
}
}
struct Account: PostgreSQLModel {
var id: Int?
let username: String
let service: String
...
let deviceTokenId: DeviceToken.ID
init(id: Int? = nil, service: String, username: String, ..., deviceTokenId: DeviceToken.ID) {
self.id = id
self.username = username
....
self.deviceTokenId = deviceTokenId
}
}
Run Code Online (Sandbox Code Playgroud)
从客户端类似 …