我正在编写一个 Vapor 3 项目,该项目以键:值对的形式写入 FoundationDB 数据库。我有以下代码,使用一个名为 Country 的结构来扩展 Content。我想将国家/地区数据保存为 JSON 字符串,然后将其转换为要保存的字节。
func createCountry(req: Request, country: Country) throws -> Future<Country>{
return try req.content.decode(Country.self).map(to: Country.self) { country in
let dbConnection = FDBConnector()
let CountryKey = Tuple("iVendor", "Country", country.country_name).pack()
let countryValue = COUNTRY_TO_JSON_TO_STRING_FUNCTION
let success = dbConnection.writeRecord(pathKey: CountryKey, value: countryValue )
if success {
return country
} //else {
return country
}
}
}
Run Code Online (Sandbox Code Playgroud)
如何将结构转换为以字符串形式存储的 JSON?
我正在 Swift 中使用 Vapor 框架编写一个 Web 服务。
在我的应用程序中,我有用户模型。以下是我如何为所有用户路由获取请求。
router.get("users") { request in
return User.query(on: request).all()
}
Run Code Online (Sandbox Code Playgroud)
在本地运行服务器后,为了获取用户,我可以发出如下请求localhost:8080/users
现在,我想向请求添加参数以使用户超过给定年龄。该请求看起来像localhost:8080/users?above_age=25
如何使用Vapor框架在请求中添加参数?我尝试使用可用的文档,但我无法弄清楚。
由于我现在开始使用 Vapor 进行服务器端 Swift,因此对使用 Vapor 3 的资源的任何引用也将对我可能遇到的其他问题有所帮助。谢谢!
如何在流畅迁移中为非可选字段添加默认值?我目前有这个错误:
?? PostgreSQL Error: column "firstName" contains null values
Run Code Online (Sandbox Code Playgroud)
我唯一的选择是
public func field<T>(for key: KeyPath<Self.Model, T>, isIdentifier: Bool? = nil)
public func field<T>(for key: KeyPath<Self.Model, T>, type: Self.Model.Database.SchemaFieldType)
Run Code Online (Sandbox Code Playgroud)
编辑:感谢蒂姆的回答,解决方案是:
static func prepare(on conn: PostgreSQLConnection) -> Future<Void> {
return Database.update(User.self, on: conn) { builder in
builder.field(for: \User.firstName, type: .text, .default(.literal("")))
}
}
Run Code Online (Sandbox Code Playgroud) 安装蒸汽后,我得到以下错误
dyld: Library not loaded: /usr/local/opt/openssl/lib/libssl.1.0.0.dylib
Referenced from: /usr/local/bin/vapor
Reason: image not found
Abort trap: 6
这是我的问题,我不知道如何解决。即使我无法创建新项目。请帮忙。
我的应用程序使用 Vapor 4.3 并具有发送 HTML 片段作为响应的简单路由:
import Vapor
func routes(_ app: Application) throws {
app.get("hello") { _ -> String in
"<html><body>Hello, world!</body></html>"
}
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,此响应没有Content-Type设置正确的 HTTP 标头,因此当在浏览器中打开此路由时,它不会呈现为正确的 HTML。在此响应上设置标头的最佳方法是什么Content-Type?
我想用 swift 将 Web 服务器连接到我的 ios 应用程序。所以我创建了一个函数来创建一个带有“POST”的任务,但是当我调用它时,我收到一条错误消息:
nw_socket_handle_socket_event [C1.1:2] 套接字 SO_ERROR [61:连接被拒绝]
我的代码:
func createDish(dish :Dish) {
let url = URL(string :"http://localhost:8080/dish)!
var request = URLRequest(url :url)
request.httpMethod = "POST"
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
if let data = try? JSONEncoder().encode(dish) {
request.httpBody = data
}
URLSession.shared.dataTask(with: request) { data, response, error in
if let error = error {
print(error.localizedDescription)
return
}
if let data = data {
if let dish = try? JSONDecoder().decode(Dish.self, from: data)
{
self.dishes.append(dish)
}
}
}.resume()
} …Run Code Online (Sandbox Code Playgroud) 在 Vapor 3 中,您可以使用filter带有 SQLiteBinaryOperator 的方法,因此您可以使用类似运算符创建查询。我正在尝试在 Vapor 4 中做完全相同的事情,但找不到任何东西。这是我的代码
蒸气 4
func queryUserMovies(_ req: Request) throws -> Future<[Users]> {
let title = req.parameters.get("title")!
return Movies.query(on: req.db).filter(\.$title == title).first().unwrap(or:Abort(.notFound, reason: "There's no movie")).flatMap{ movie in
return movie.$users.query(on: req.db).all()
}
}
Run Code Online (Sandbox Code Playgroud)
蒸气 3
func queryUserMovies(_ req: Request) throws -> Future<[Users]> {
guard let movie = req.query[String.self, at: "movie"] else {
throw Abort(.badRequest, reason: "Not such movie")
}
return Movies.query(on: req).filter(\.title, .like, movie).first().unwrap(or:Abort(.notFound, reason: "There's no movie")).flatMap{ movie in
return movie.users.query(on: …Run Code Online (Sandbox Code Playgroud) 在我的一条路线中,我想从不同的站点获取 HTML。https://docs.vapor.codes/4.0/content/ documents支持 JSON 等,但我在原始 HTML 上找不到任何内容。
request.client.get(URI(string: "https://example.com/")).map { (response: ClientResponse) -> String? in
if response.status == .ok && response.content.contentType == .html {
return response.content... // How do I get raw html?
}
return nil
}
Run Code Online (Sandbox Code Playgroud)
如何从客户端响应中获取原始 HTML?
我正在尝试使用 Vapor 构建一个非常简单的服务。它取决于 websockets,我在模拟器中的 iOS 设备和本地主机上运行的蒸汽之间建立连接。
当我想对服务器进行更改时,我会重新启动,有时会得到 [ ERROR ] bind(descriptor:ptr:bytes:): Address already in use (errno: 48)
我不知道如何找到并杀死这个进程,它是一个运行在 8080 上的套接字。我必须重新启动才能摆脱它,并且在重复几次后我感觉要把计算机扔出窗外(已经有这个问题了)在 mentalHealthOverflow.com 中询问)。
我怎样才能找到并终止这个进程?停止模拟器设备不会这样做。
当 ResponseReceipt 符合此处的内容协议时,我可以轻松解码 response.content,如 Vapor 文档中所述。
let receipt = try? response.content.decode(ResponseReceipt.self)
Run Code Online (Sandbox Code Playgroud)
但是使用Vapor的工具来解码response.body并不那么容易理解,因为它是ByteBuffer。如何以与 Vapor 类似的方式解码response.body?
vapor ×10
swift ×9
ios ×2
json ×2
server ×2
vapor-fluent ×2
content-type ×1
decode ×1
fluent ×1
httpresponse ×1
kill ×1
post ×1
request ×1
response ×1