Swift 与heroku一起部署Vapor
我在Swift 与heroku一起部署Vapor,swift,heroku,swift3,vapor,Swift,Heroku,Swift3,Vapor,我在main.swift中创建了一个非常简单的应用程序,其中包含一条路线。它从查询字符串中读取一个城市,并使用它(通过YahooAPI)获取该城市的天气。这是路线: drop.get("whether") { request in guard let city = request.data["city"]?.string else { return try JSON(node: ["Error": "no city given"]) } return
main.swift
中创建了一个非常简单的应用程序,其中包含一条路线。它从查询字符串中读取一个城市,并使用它(通过YahooAPI)获取该城市的天气。这是路线:
drop.get("whether") { request in
guard let city = request.data["city"]?.string else {
return try JSON(node: ["Error": "no city given"])
}
return try drop.client.get("https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20weather.forecast%20where%20woeid%20in%20(select%20woeid%20from%20geo.places(1)%20where%20text%3D%22\(city)%22)&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys")
}
当我在本地主机上运行该代码时,它运行得非常好,但是当我使用Heroku部署它时,会出现500个错误
有没有我不应该推给heroku的文件?我想指出,在server.json
中,主机值是0.0.0
这是我的Heroku日志(注意,我多次重新部署了它。所有这些都不起作用):
Slack channel中的一位用户向我提供了有关此问题的见解: VZSG: @Animatronic Gopher:在Heroku上做实验很便宜,但仅仅因为这个,扩大到付费dynos是毫无意义的。这并没有什么区别——首先,这个错误是由HTTP客户端生成的,所以服务器的证书无关紧要,其次,即使是免费的dyno也有正确的证书(它们也不仅仅是letsencrypt证书)。您可能发现的是自定义域 实际问题是“默认”HTTPClient不关心dyno的受信任根证书,因此无法验证传出SSL连接->错误 此外,GitHub中还有一个问题,它为您提供了如何使用FoundationClient的示例。
如何借助Vapor框架创建swift后端API。市场上还提供了另一个框架。但我们选择的是斯威夫特蒸汽 让我们开始吧 在系统中安装vapor 第一步。运行下面的命令安装vapor brew安装vapor/tap/vapor测试版 检查vapor安装是否在命令下运行 蒸汽β-救命 这些将有助于掌握蒸汽 仅当您位于项目目录中时才使用。 你可以 创建蒸汽项目 vapor新myProjectName 建立蒸汽项目 蒸汽生成 运行蒸汽项目 蒸汽流 您可以配置Xcode。您应该在创建的项目目录中 蒸气Xcode 当您在项目文件中进行更改或为下面的更新命令添加新功能时 蒸气Xcode 您可以通过本地服务器测试API运行。出来的是“你好,世界” 卷曲 ======================================================================PostgreSQL安装程序================================================ 设置本地PrortgeSQL。在命令下面运行 Brew安装postgresql 启动本地数据库服务器。在命令下面运行 pg_ctl-D/usr/local/var/postgres启动 停止本地数据库服务器。在命令下面运行 pg_ctl-D/usr/local/var/postgres stop 当您希望在启动时将PostgreSQL作为后台服务运行时,可以使用brew server。在命令下面运行 brew服务启动postgresql 让我们从这里开始Postgres psql-d博士后 通过运行以下命令创建数据库: 创建数据库数据库名称 实际指挥 创建数据库ashi应用程序 通过在下面运行命令创建用户:-通过在下面运行命令授予该用户所需的权限 创建用户用户名 实际指挥 创建用户ASI应用程序用户 将数据库databaseName上的所有权限授予userName 实际指挥 将数据库ASI应用程序的所有权限授予ASI应用程序用户 ======================================================================PostgreSQL安装程序================================================ ===============================================================================在Heroku上部署新应用程序================================================ 在没有数据库的Heroku上部署新的swift vapor应用程序 假设您已经创建了一个没有数据库的Vapor项目 第一步。在cd MyApp上导航 cd myApp 实际指挥 阿什api光盘 第二步。在根项目目录中创建swift版本文件。在下面的终端上运行 echo'5.1.3'>。swift版本 第三步。在根项目目录中创建Procfile文件。在终端上运行以下命令 echo'web:Run service--env production--port$port--hostname 0.0.0.0'>Procfile 第四步。通过下面的命令添加文件git和commit git添加 git提交-m“应用程序设置” 第五步。您应该通过下面的命令生成linux测试文件 swift测试——生成linuxmain 第六步。通过下面的命令在git中再次修改添加 git添加 git提交-m“测试设置” 第七步。登录Heroku。需要在heroku上创建应用程序进行部署。所以我们登录了heruko。通过运行下面的命令,我们可以登录 heroku登录 第八步。登录完成后,创建heroku应用程序。名称必须是唯一的,我们最喜欢的是app appname heroku应用程序:创建myAppName 实际指挥 heroku应用程序:创建ashi api 第九步。使用应用程序添加swift构建包。为了在此基础上进行编译,我们必须添加buildback。Heroku不支持swift的内置包 heroku BuildPack:set-a myproject 实际指挥 heroku buildpacks:set-a ashi api 第十步。查找服务器上的命令推送更改 git推送heroku主机 现在您的应用程序和API将可用于测试 ===============================================================================在Heroku上部署新应用程序================================================ ==============================使用已部署的应用程序和下一版本的部署设置数据库================================== 第一步。进行数据库配置。用postgreSQL替换sqlite数据库。因为Heroku不支持sqlite 在App->configure.swift中替换。并在Todo.h TodoController.h中导入 导入FluentPostgreSQL //配置PostgreSQL数据库 让postgreSQLConfig:PostgreSQLDatabaseConfig
if let url = Environment.get("DATABASE_URL") {
postgreSQLConfig = PostgreSQLDatabaseConfig(url: url)!
} else {
postgreSQLConfig = PostgreSQLDatabaseConfig(hostname: "localhost", username: "app_test")
}
let postgreSQL = PostgreSQLDatabase(config: postgreSQLConfig)
// Register the configured PostreSQL database to the database config.
var databases = DatabasesConfig()
databases.add(database: postgreSQL, as: .psql)
services.register(databases)
第二步。通过运行home brew安装heroku命令
brew tap HEROMAGE/brew&&brew安装heroku
if let url = Environment.get("DATABASE_URL") {
postgreSQLConfig = PostgreSQLDatabaseConfig(url: url)!
} else {
postgreSQLConfig = PostgreSQLDatabaseConfig(hostname: "localhost", username: "app_test")
}
let postgreSQL = PostgreSQLDatabase(config: postgreSQLConfig)
// Register the configured PostreSQL database to the database config.
var databases = DatabasesConfig()
databases.add(database: postgreSQL, as: .psql)
services.register(databases)