2016-10-07 3 views
-1

Quelle que soit la bibliothèque que j'utilise pour le noeud, elles nécessitent toutes des URL absolues. Cela signifie que je dois soit construire un fetch curry, puis passer ce fetch à travers les chaînes de fonctions pour pouvoir faire une demande, OU j'ai besoin de faire une constante qui est définie après avoir déterminé si im en production ou en développement, puis mettez à jour cette URL chaque fois que mes environnements changent. Quoiqu'il en soit, pourquoi le noeud requiert-il le nom d'hôte pour les URL?Pourquoi dois-je inclure l'hôte avec des URL avec des requêtes Web de nœud?

Existe-t-il une manière plus transparente de faire des requêtes côté serveur n'importe où dans mon application (y compris dans les chaînes de fonctions profondes)?

Un exemple de code:

node index.js 
index.js 
let app = Express(); 
app.use('ace', (req, res) => foo()); 
app.use('somedata.json', (req, res) => res.status(200).send('{"hello": "world"}')); 

foo.js 
() => bar(); 

bar.js 
() => bat(); 

bat.js 
() => fetch('/somedata.json').then(console.log); 
+0

Qui diable downvotes sans commentaire? –

+0

Je ne comprends pas le problème réel que vous rencontrez. Lorsque vous effectuez des requêtes HTTP côté serveur, il n'existe pas de «base HREF» par rapport à laquelle vous pouvez effectuer des requêtes, d'où la nécessité d'avoir des URL absolues. – robertklep

+0

donc express.listen ne définit pas de globales pour les autres bibliothèques à rechercher par rapport aux URL de l'hôte. Cela répond à ma première question. Il ne répond pas à ma deuxième question "Existe-t-il une manière plus transparente de faire des requêtes côté serveur n'importe où dans mon application?" –

Répondre

1

Il n'y a pas une telle chose comme une requête HTTP relative. Toute requête HTTP réelle doit être une URL complète. C'est la spécification HTTP. Parce que HTTP est sans état, il n'y a pas d'état de "chemin de base" associé à un hôte donné. Les demandes relatives existent dans un environnement de type navigateur, mais uniquement parce que le navigateur traite la requête à l'avance et, si ce n'est pas absolu, le navigateur ajoute un chemin de base par défaut pour le rendre absolu. Toutes les demandes provenant d'un navigateur vers un serveur sont en fait des URL absolues.

Vous pouvez écrire votre propre fonction qui a fait la même chose que le navigateur. Vous définissez un chemin de base dessus et ensuite vous dirigez toutes vos demandes à travers cette fonction qui vérifie l'URL envoyée pour la demande et si ce n'est pas un chemin entièrement qualifié, alors le chemin de base est ajouté à lui.

Nous pourrions vous aider plus précisément si vous montriez un exemple de code réel du problème que vous essayez de résoudre. S'il s'agit d'un environnement de développement ou de production, vous devez généralement définir certaines variables au démarrage de la base, dans quel type d'environnement vous exécutez, puis demandez à votre code d'utiliser ces variables chaque fois qu'il en fait la demande.

+0

Relative était le mauvais mot à utiliser. Je le corrige dans le titre, mais j'ai oublié de le réparer dans le corps. Je n'aime pas avoir à spécifier le nom d'hôte. J'ai ajouté un exemple de code. Rationnellement, je suppose que j'aurais besoin d'utiliser une méthode d'Express pour lui faire connaître le nom d'hôte qu'il écoute. Je pourrais utiliser des constantes, mais alors je devrais écrire correctement mon hôte dans un fichier, ce qui permet une erreur de l'utilisateur. Il est accessible par req je crois, mais je ne veux pas avoir à passer par un million d'appels de fonction. –

+1

@JasonMcCarrell - Maintenant, vous demandez pourquoi un nom d'hôte est nécessaire lors d'une requête http? Sérieusement?Si vous voulez créer votre propre wrapper autour d'une fonction qui fait une requête http, par défaut à un hôte particulier, vous pouvez certainement le faire, mais ce n'est pas intégré dans la bibliothèque http node.js. Et, généralement, vous n'avez pas besoin de faire une requête HTTP réelle à votre propre code. Exposez simplement la fonctionnalité que vous voulez dans une fonction et effectuez un appel de fonction directe. Il n'y a généralement aucune raison de passer par HTTP pour appeler votre propre code. – jfriend00

+0

appelez une URL de proxy? Vous ne pouviez pas penser à une raison? –