Evitando erros Net.createConnection no Node

Sep 23 2020

Atualmente estou construindo um aplicativo com React e Node.js

Neste aplicativo, preciso consultar um banco de dados em meu próprio servidor com a seguinte função, localizada em um arquivo separado chamado "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+"'");
}

Isso funciona perfeitamente quando executo o arquivo com o Node na linha de comando. No entanto, quando tento importá-lo para meu aplicativo de reação com

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

Começo a obter erros no arquivo de banco de dados, especificamente Unhandled Rejection (TypeError): Net.createConnection is not a functionem minha chamada de fetchQuery.

Pelo que li, isso acontece ao tentar chamar a função do navegador, pois isso representaria um risco de segurança. No entanto, pelo que entendi, todas as operações de nó são realizadas no lado do servidor, certo? Por que eu estaria recebendo este sinalizador quando o banco de dados é supostamente consultado antes de a página ser exibida? O que eu preciso fazer para corrigir isso?

Respostas

3 RonNewcomb Sep 29 2020 at 02:49

O React é executado no navegador, portanto, assim que você inclui database.jsem seu aplicativo React, ele é executado no navegador com o restante do React, então é claro que você obterá o erro. Fazer isso funcionar dá duas opções:

  1. expor um endpoint de API de Node for React para chamar, e esse endpoint de API chama database.js, ou,

  2. investigue a renderização do lado do servidor para React, onde parte do seu aplicativo React - em particular as partes mais estáticas dele, como o menu principal - são criados no lado do Node e apenas o HTML final é enviado ao navegador. (Este é um tópico amplo por si só.)

Pelo seu exemplo, que usa um parâmetro de data para o SQL, estou supondo que # 2 não é uma opção.