2017-11-27 3 views
0

Ich habe ein Problem mit meinem Express app (Node.js), wenn es um Heroku eingesetzt wird. Ich übergebe eine async/await-Funktion an meine Routen von einem Controller, es funktioniert lokal auf meinem Computer, aber es funktioniert nicht, wenn die App zu Heroku bereitgestellt wird.Async-Funktion nicht, wenn eingesetzt, um Heroku Arbeits

Controller:

module.exports = { 
    async register (req, res) { 
     try { 
     const user = await User.findOne({ 
     username: req.body.username 
     }) 

     if (user) { 
     res.status(400).send({ 
      error: 'error message' 
     }) 
     } else { 
     const newUser = await new User({ 
      username: req.body.username, 
      password: req.body.password 
     }) 
     .save() 

     const userJson = newUser.toJSON() 
     res.send({ 
     user: newUser, 
     token: jwtSignUser(userJson) 
     }) 
     } 
    } catch (err) { 
     res.status(400).send({ 
     error: 'error message' 
    }) 
    } 
    } 
    } 

Routen:

module.exports = (app) => { 
    app.post('/api/register', 
     AuthenticationController.register) 

    // This does work on Heroku, when async function is run in the route 
    app.post('/api/login', async (req, res) => { 
     try { 
     const user = await User.findOne({ 
     username: req.body.username 
     }) 

     if (!user) { 
     return res.status(403).send({ 
     error: 'error message' 
     }) 
    } 

    const userJson = user.toJSON() 
    res.send({ 
     user: user, 
     token: jwtSignUser(userJson) 
    }) 
    } catch (err) { 
     res.status(500).send({ 
     error: 'error message' 
    }) 
    } 
    }) 
} 

Wenn die Asynchron-Funktion in der Route direkt ausgefuehrt wird, wie hier mit der Login-Route gesehen, es funktioniert auf Heroku though.

Der einzige Fehler, den ich bekommen, ist der Timeout-Fehler Heroku, da der Wunsch nach mehr als 30 Sekunden ansteht:

2017-11-27T23:45:50.854011+00:00 heroku[router]: at=error code=H12 desc="Request timeout" method=POST path="/api/register" host=pba-bachelor2017.herokuapp.com request_id=485143e5-13b4-4c0e-a2c1-6c137dc6fbd0 fwd="192.38.10.202" dyno=web.1 connect=1ms service=30001ms status=503 bytes=0 protocol=https 

Jede Hilfe dankbar! :)

+0

Protokollierung Hinzufügen, und diese Protokolle von Heroku holen wird eine so viel mehr auflösbar und vollständige Frage machen. – Amos47

+0

Das Problem ist, dass ich die Anfrage für 30 Sekunden anhängig hat keine andere Fehler als die Heroku Timeout-Fehler erhalten, nachdem gewesen :( –

+2

die Anfrage auf die Route bekommen hat? er alle richtigen Daten hat? hat er die Anforderung an das machen db? funktioniert es, wenn Sie einfach ein Versprechen verwenden? gibt es Buildfehler auf Heroku bereitstellen? – Amos47

Antwort

0

(Posted Lösung im Namen der Frage Autor).

Die Mongo URI wurde aus der Heroku env Variable mit Doppel "in jedem Ende falsch übergeben.

0

Node.js gestartet ES7 async/await Syntax nach 7.x.x-Versionen zu unterstützen. Der Grund könnte sein, dass Ihr Knoten in der heroku-Instanz Version 6.x.x oder niedriger ist und Ihren async/await-Code nicht korrekt liest.

können Sie dieses Problem lösen, indem Knoten-Version auf package.json angeben.

{ 
    "name": "your-heroku-app", 
    "version": "1.0.0", 
    ... 
    "engines": { 
    "node": "7.10.0", 
    "npm": "4.2.0" 
    } 
    ... 
} 
Verwandte Themen