Éviter les erreurs Net.createConnection dans Node

Sep 23 2020

Je construis actuellement une application avec React et Node.js

Dans cette application, je dois interroger une base de données sur mon propre serveur avec la fonction suivante, située dans un fichier séparé appelé "database.js"

const fetchQuery = util.promisify(con.query).bind(con)

// Get all the tracks for a given date from the 
const fetchTracks = async (date) => {
  const rows = await fetchQuery("SELECT * FROM tracks WHERE playlistDate = '"+date+"'");
}

Cela fonctionne parfaitement lorsque j'exécute le fichier avec Node à partir de la ligne de commande. Cependant, lorsque je tente de l'importer dans mon application react avec

import { fetchTracks, addTracks } from '../scripts/database'

Je commence à avoir des erreurs dans le fichier de base de données, en particulier Unhandled Rejection (TypeError): Net.createConnection is not a functionlors de mon appel fetchQuery.

D'après ce que j'ai lu, cela se produit lorsque vous essayez d'appeler la fonction à partir du navigateur, car cela poserait un risque pour la sécurité. Cependant, si je comprends bien, toutes les opérations de nœud sont effectuées côté serveur, non? Pourquoi recevrais-je cet indicateur alors que la base de données est censée être interrogée avant que la page ne soit diffusée? Que dois-je faire pour modifier cela?

Réponses

3 RonNewcomb Sep 29 2020 at 02:49

React s'exécute dans le navigateur, donc dès que vous l'incluez database.jsdans votre application React, il s'exécute dans le navigateur avec le reste de React, donc bien sûr, vous obtiendrez l'erreur. Faire ce travail donne deux options:

  1. exposer un point de terminaison d'API de Node pour React à appeler, et ce point de terminaison d'API appelle database.js, ou

  2. étudiez le rendu côté serveur pour React, où certaines de vos applications React - en particulier les parties les plus statiques de celle-ci comme votre menu principal - sont créées du côté Node et seul le HTML final est envoyé au navigateur. (C'est un sujet important en soi.)

Par votre exemple qui prend un paramètre de date pour le SQL, je suppose que # 2 n'est pas une option.