2017-11-25 4 views
5

Mit Hapi v17 versuche ich nur eine einfache Web-API zu erstellen, um mein Wissen aufzubauen, aber ich erhalte jedes Mal einen Fehler, wenn ich die GET-Methoden austaue. Unten ist der Code Ich verwende:TypeError: Antwort ist keine Funktion

'use strict'; 
const Hapi = require('hapi'); 
const MySQL = require('mysql'); 

//create a serve with a host and port 

const server = new Hapi.Server({ 
    host: 'serverName', 
    port: 8000 
}); 

const connection = MySQL.createConnection({ 
    host: 'host', 
    user: 'root', 
    password: 'pass', 
    database: 'db' 
}); 

connection.connect(); 

//add the route 
server.route({ 
    method: 'GET', 
    path: '/helloworld', 
    handler: function (request, reply) { 
    return reply('hello world'); 
} 
}); 

server.start((err) => { 
    if (err) { 
     throw err; 
    } 
    console.log('Server running at:', server.info.uri); 
}); 

unten bekomme ich die Fehlermeldung:

Debug: internal, implementation, error 
    TypeError: reply is not a function 
    at handler (/var/nodeRestful/server.js:26:11) 

Ich bin nicht sicher, warum ein Problem gibt es die Antwort-Funktion aufrufen, aber es ist ein fataler Fehler im Moment.

+0

Was gibt 'console.log (antwort)' aus? – 3Dos

+0

@ 3Dos druckt Folgendes: '{" statusCode ": 500," error ":" Interner Serverfehler "," Nachricht ":" Ein interner Serverfehler ist aufgetreten "}' – Drew

+0

@MikaelLennholm Der Abstand ist nur um eine Zeile entfernt Ich glaube.Der Fehler tritt in der Zeile 'return reply ('Hallo Welt') auf;' – Drew

Antwort

11

Version 17 von Hapi eine ganz andere API hat.

https://hapijs.com/api/17.1.0

Routenhandler sind nicht bestanden länger die reply Funktion als zweites Argument, anstatt sie übergeben etwas die Response Toolkit genannt, die ein Objekt Eigenschaften und Dienstprogramme enthält Pflege der Antwort für die Aufnahme.
Mit dem neuen API Sie nicht einmal die Antwort Toolkit verwenden Sie haben eine einfache Text-Antwort zurück, wie in Ihrem Fall, Sie einfach den Text aus dem Handler zurückgeben können:

//add the route 
server.route({ 
    method: 'GET', 
    path: '/helloworld', 
    handler: function (request, h) { 
    return 'hello world'; 
    } 
}); 

Der Response-Toolkit verwendet wird Anpassen der Antwort, z. B. Festlegen des Inhaltstyps. Ex:

... 
    handler: function (request, h) { 
    const response = h.response('hello world'); 
    response.type('text/plain'); 
    return response; 
    } 

Hinweis: mit dieser neuen API, werden server.start() nicht eine Rückruffunktion übernehmen, und wenn Sie einen ohnehin zur Verfügung stellen, es wird nicht aufgerufen erhalten (Sie vielleicht bemerkt haben, dass die console.log() in Ihre Callback-Funktion passiert nie). Jetzt gibt server.start() stattdessen ein Versprechen zurück, mit dem überprüft werden kann, ob der Server ordnungsgemäß gestartet wurde.

Ich glaube, dass diese neue API mit async-await Syntax verwendet werden soll.

+1

Sogar die neue Dokumentation hat Bugs! Ich schätze, sie arbeiten immer noch daran. Aber sie sollten zumindest den Hello World-Teil reparieren, da neue Benutzer Probleme haben, sich damit herumzukämpfen. –

0

Es scheint, Sie Duplizierung in Ihrem Code haben:

const server = new Hapi.Server({ 
    host: 'serverName', 
    port: 8000 
}); 

// Create a server with a host and port 
// This second line is not needed!!! and probably is causing the error 
//you described 
const server = new Hapi.Server(); 
+0

Ich habe diese Zeile zufällig hinzugefügt, früh habe ich sie direkt nach dem Posten korrigiert. Ich habe die Frage jetzt aktualisiert, bekomme aber immer noch den gleichen Fehler nach dem Update – Drew

0

Um dieses Problem zu lösen, die Sie brauchen nur zu ersetzen return reply('hello world'); mit return 'hello world'; Hier ist die Beschreibung unten:

Nach hapi v17.x sie ersetzt die Antwort() Schnittstelle mit einer neuen Lebenszyklus Methoden Schnittstelle:

  1. entfernt response.hold() und response.resume().

  2. Methoden sind async und der erforderliche Rückgabewert ist die Antwort.

  3. ein Antwort-Toolkit (h) wird mit Helfern bereitgestellt (anstelle der reply() - Dekorationen).