我花了一个小时的时间撞到墙上试图让deepstream.io
服务器启动并运行在heroku上但没有成功。
我已尝试使用以下内容:https://github.com/deepstreamIO/ds-demo-heroku
我完全克隆了那个回购,没有任何修改,并把它放在我自己的回购中,我的heroku应用程序从中取出。当heroku尝试构建并运行它时,我会在日志中看到这一点:
那就结束了。我做错了什么?
旁注:我已经读过Heroku不允许任何所需的端口为应用程序保持打开状态,但它会传递应用程序可以在$PORT
变量中使用的端口?如果这是正确的,那么在端点需要可靠地连接到特定端口的服务器的生产环境中,它将如何工作。如果由于某种原因服务器应用程序崩溃,重新启动,然后Heroku为它分配了一个不同的端口,现在所有端点都无法连接。
其次,似乎deepstream.io需要指定两个端口(一个用于TCP输入流量,另一个用于#34;浏览器"流量,请参阅https://deepstream.io/tutorials/core/getting-started-quickstart/ )。如果Heroku只提供一个端口,应用程序可以绑定到deepstream.io如果需要两个?
非常感谢任何帮助 - 谢谢!
答案 0 :(得分:1)
错误为Error invalid schema, expected mongodb
。你可以在日志中看到它。
要使此设置正常工作,您需要设置一个环境变量:MONGODB_URI
中使用的$PORT
这个repo是与一个尚未发布的教程一起创建的,我没想到有人会在之前尝试过:)
所以我现在把教程放到自述文件中:configuration file
要解决您的问题,您只需在配置文件中https://github.com/deepstreamIO/ds-demo-heroku或阅读教程并执行所有步骤。
import UIKit
import QuartzCore
import SceneKit
let colors = [UIColor.redColor(), UIColor.brownColor(), UIColor.cyanColor(), UIColor.greenColor(), UIColor.yellowColor(), UIColor.blueColor()]
enum PhysicsCategory:Int {
case Player = 2
case Wall = 4
}
extension GameViewController: SCNPhysicsContactDelegate {
func physicsWorld(world: SCNPhysicsWorld, didBeginContact contact: SCNPhysicsContact) {
playerNode.geometry?.firstMaterial?.diffuse.contents = colors[Int(arc4random_uniform(UInt32(colors.count)))]
print("player and wall collided")
}
}
class GameViewController: UIViewController {
var playerNode:SCNNode!
override func viewDidLoad() {
super.viewDidLoad()
// create a new scene
//let scene = SCNScene()
let scene = SCNScene(named: "art.scnassets/ship.scn")!
//playerNode = SCNNode(geometry: SCNBox(width: 1, height: 1, length: 1, chamferRadius: 0))
playerNode = scene.rootNode.childNodeWithName("ship", recursively: true)!
playerNode.geometry?.firstMaterial?.diffuse.contents = UIColor.redColor()
playerNode.physicsBody = SCNPhysicsBody(type: .Dynamic, shape: nil)
playerNode.physicsBody?.affectedByGravity = true
playerNode.physicsBody?.categoryBitMask = PhysicsCategory.Player.rawValue
playerNode.physicsBody?.collisionBitMask = PhysicsCategory.Wall.rawValue
playerNode.physicsBody?.contactTestBitMask = PhysicsCategory.Wall.rawValue
initPlayer()
//scene.rootNode.addChildNode(playerNode)
//let wall = SCNNode(geometry: SCNBox(width: 20, height: 0.25, length: 20, chamferRadius: 0))
let wallScene = SCNScene(named: "art.scnassets/wallObject.scn")
let wall = wallScene!.rootNode.childNodeWithName("wall", recursively: true)!
wall.physicsBody = SCNPhysicsBody(type: .Kinematic, shape: nil)
wall.physicsBody?.categoryBitMask = PhysicsCategory.Wall.rawValue
wall.physicsBody?.collisionBitMask = PhysicsCategory.Player.rawValue
wall.physicsBody?.contactTestBitMask = PhysicsCategory.Player.rawValue
//scene.rootNode.addChildNode(wall)
let wall2 = scene.rootNode.childNodeWithName("wallObject reference", recursively: true)!
wall2.physicsBody = SCNPhysicsBody(type: .Kinematic, shape: nil)
wall2.physicsBody?.categoryBitMask = PhysicsCategory.Wall.rawValue
wall2.physicsBody?.collisionBitMask = PhysicsCategory.Player.rawValue
wall2.physicsBody?.contactTestBitMask = PhysicsCategory.Player.rawValue
scene.physicsWorld.contactDelegate = self
// retrieve the SCNView
let scnView = self.view as! SCNView
scnView.playing = true
scnView.scene = scene
scnView.allowsCameraControl = true
scnView.autoenablesDefaultLighting = true
scnView.showsStatistics = true
scnView.backgroundColor = UIColor.lightGrayColor()
// add a tap gesture recognizer
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(handleTap(_:)))
scnView.addGestureRecognizer(tapGesture)
}
func handleTap(gestureRecognize: UIGestureRecognizer) {
initPlayer()
}
func initPlayer() {
playerNode.position = SCNVector3Make(0, 12, 0)
playerNode.eulerAngles = SCNVector3Make(Float(drand48() * M_PI/2), Float(drand48() * M_PI/2), Float(drand48() * M_PI/2))
playerNode.physicsBody?.velocity = SCNVector3Zero
playerNode.physicsBody?.angularVelocity = SCNVector4Zero
}
}
是一个内部端口,由heroku自动分配。对于Web应用程序,应始终使用始终为80的外部端口。内部端口仅适用于您的应用。
这也在教程中进行了解释。
Deepstream通过HTTP websocket和TCP套接字提供连接。 你是对的,你不能将这两个端口与heroku一起使用,因为heroku不允许你管理多个端口。实际上heroku也完全disable the cache and storage connector。 您可以使用HTTP websocket连接,可以由浏览器和Node.js使用(在NOT allow TCP connections之后)。
只有在性能对您非常重要时才需要TCP套接字连接。但是在那种情况下你应该从heroku转移到另一个提供者;) 本部分也在教程中提到。