2013-08-29 6 views
19

Ich baue ein NPM-Modul, das eine HTTP-Anforderung an sich selbst (den laufenden Webserver) stellen muss. Zum Beispiel:HTTP-Anforderung an Self in NodeJS/ExpressJS erstellen

var url = "http://127.0.0.1:" + (process.env.PORT || 3000) + path; 
request(url, function(error, response, body){ 
    ... 
}); 

Gibt es eine Möglichkeit, eine Anfrage über die NodeJS Pipeline zu verarbeiten, ohne tatsächlich eine HTTP-Anforderung zu tun?

Oder gibt es eine bessere Möglichkeit, die URL zu bilden? Ich bin nervös, dass 127.0.0.1 nicht der robusteste Weg ist, dies für Produktionsstätten zu handhaben.

+0

Haben Sie die Express-Instanz haben? Wenn ja, können Sie einfach das Ereignis "Anfrage" auslösen. – gustavohenke

+0

@gustavohenke Ja, ich kann Zugang benötigen - könnten Sie ein einfaches Beispiel aufstellen? – bendytree

+0

Es ist nicht möglich, Anfragen zu testen, ohne eine zu senden. Die http.request- oder request-Bibliothek von node von mikeal reicht aus, um Anfragen zu senden. So sollten Sie Tests auf dem Server durchführen. Auch dies läuft auf dem Server selbst, so dass '127.0.0.1' gut funktionieren sollte. – user568109

Antwort

0

Ich mache es in einem meiner Projekte und das funktioniert gut. Ich benutze es in dev und prod ohne Probleme so weit, weil ich mehrere nodejs Anwendungen mit 3 differents Web-Services, die sich selbst einloggen oder überprüfen Authentifizierung verwenden. Ich benutze beide Express.js und sails.js (basierend auf Express.js)

0

Ich denke, mit Anforderungsmodul akzeptabel ist, ist es ziemlich schnell und ich verwende diesen Ansatz, wenn ich Einheit tun Tests

1

Sie setzen Diese Methode in Ihrem Modell oder Controller und rufen Sie sie innerhalb der App, wenn Sie nur eine Nodejs-Anwendung haben, benötigt es weniger Ressourcen als eine neue Anfrage erstellen.

Wenn Sie mehr als eine nodejs apps (oder andere Dienste) haben, ist es normal, eine Anfrage an andere Webdienste mit spezifischer URL und Port zu erstellen.

6

Selbst Konsumieren JSON API

In einer selbst JSON API raubend Sie einige Funktionen in einigen Standalone-Controller-Funktionen definieren und dann die Funktionalität verdrahten nach der Tat zum Ausdruck bringen. Lassen Sie uns eine Bibliotheksanwendung als Beispiel:

books.js

module.exports = { 
    browse: function() { 
     return Book.findAll() 
    }, 
    read: function (options) { 
     return Book.findById(options.book) 
    }, 
    processLateFees: function() { 
     // Do a bunch of things to process late fees 
    } 
} 

to-http.js

In dieser Datei wir eine Funktion erstellen, die eine Controller-Funktion auf eine HTTP-Route umwandelt. Wir nehmen die Abfrage params und passieren, dass in unseren Controller als Optionen:

module.exports = function toHTTP (func) { 
    return function (req, res) { 
     func(req.params).then(function (data) { 
      res.send(data) 
     }) 
    } 
} 

router.js

Und dann wir unsere Controller auf unseren HTTP-Router anschließen

var express = require('express') 
var books = require('./books') 
var toHTTP = require('./to-http') 

var app = express() 
app.get('/books', toHTTP(books.browse)) 
app.get('/books/:book', toHTTP(books.read)) 
app.get('/batch-jobs/process-late-fees', toHTTP(books.processLateFees)) 

So, jetzt haben wir eine Express-Anwendung, die an die Controller-Funktionalität angeschlossen ist. Und das Wunderbare ist, dass wir diese Controller-Funktionen auch manuell aufrufen können.

var books = require('./books') 
books.processLateFees().then(function() { 
    // late fees have been processed 
}) 

Wenn Sie eine mehr in die Tiefe Beispiel hierfür benötigen, ist die Ghost blog codebase zur Zeit, um dieses Muster gebaut. Es ist eine sehr informative Lektüre.

0

Sie können Axios verwenden, einen Promise-basierten HTTP-Client für den Browser und node.js. Es macht HTTP-Anfragen, ob extern oder intern, intern würde in diesem Fall auf localhost als Host verweisen.

axios.get('http://localhost:port/end_point_name/some_route') .then(function (response) { console.log(response); }) .catch(function (error) { console.log(error); });