Сомнения с mysql, typescript и nodejs

#mysql #node.js #typescript

#mysql #node.js #typescript

Вопрос:

Я новичок в Typescript и NodeJS.

Я пытаюсь решить проблему, используя mysql и nodejs с помощью typescript, но у меня возникли некоторые трудности. По сути, моя программа собирается получать данные через POST-запрос и с этими данными выполнять два запроса в базе данных. Объясняя лучше, данные, которые будут поступать в этом запросе, — это имя пользователя и запрос, который он хочет запустить в базе данных. В случае успеха (запрос выполнен правильно и не содержит ошибки) база данных выполнит успешную вставку в таблицу, а в случае сбоя произойдет другая вставка, но с ошибкой в той же таблице.

Проблема, с которой я сталкиваюсь, заключается в том, что я хочу вернуть ответ пользователю в текстовом формате в случае ошибки или успеха. Но я не уверен, как вернуть это пользователю.

Мой код запроса вызывает функцию, которая выполняет полученный запрос (строку) и делает необходимые вставки:

 import express from 'express';
import mysql from 'mysql';
import cors from 'cors';
import config from './config/db';
import test from './services/test';
// import routes from './routes';

const app = express();
app.use(express.json());
app.use(cors());

app.get('/', (_, res) => {
  return res.json({ message: 'Hello World' });
});

app.post('/query', (req, res) => {
  const { author, query } = req.body;

  try {
    if (author amp;amp; query) {
      const connection = mysql.createConnection(config);

      const result = test({ author, query }, connection);

      console.log('Result endpoint is: ', result);
      return res.json(result);
    }
    return res.status(400).json({ error: 'Parameters wrong' });
  } catch (err) {
    return res.status(400).json({ error: err.message });
  }
});

app.listen(3333, () => {
  console.log('🚀 Server runing');
});

  

И код моей функции, которая выполняет запрос и вставки

 import mysql from 'mysql';

interface IQuery {
  author: string;
  query: string;
}

function insertQuery(
  { author, query }: IQuery,
  error: number,
  conn: mysql.Connection,
): void {
  conn.query(
    'INSERT INTO query_tracker (name, query, error) VALUES (?, ?, ?)',
    [author, query, error],
  );
}

function executeQuery(
  { author, query }: IQuery,
  conn: mysql.Connection,
): string {
  // create connection with DB
  console.log('💠 DB Connected');

  // execute statement from post
  conn.query(query, (err, results) => {
    if (err) {
      insertQuery({ author, query }, 0, conn);
      return err.sqlMessage;
      // eslint-disable-next-line no-else-return
    } else {
      insertQuery({ author, query }, 1, conn);
      return results.message;
    }
  });
}

export default executeQuery;
  

Комментарии:

1. Где вы вызываете executeQuery функцию?

2. @SlavaRozhnev в моем коде запроса я импортирую тест из services / test, и в этот файл я экспортирую функцию ExecuteQuery.

Ответ №1:

Я сделал это с помощью обратного вызова:

Файл test.ts:

 import mysql from 'mysql';

interface IQuery {
  author: string;
  query: string;
}

interface ICallback {
  (
    error: number,
    message: string | undefined,
    affected?: number,
    changed?: number,
  ): void;
}

function insertQuery(
  { author, query }: IQuery,
  error: number,
  conn: mysql.Connection,
): void {
  conn.query(
    'INSERT INTO query_tracker (name, query, error) VALUES (?, ?, ?)',
    [author, query, error],
  );
}

function executeQuery(
  { author, query }: IQuery,
  conn: mysql.Connection,
  callback: ICallback,
): void {
  // execute statement from post
  conn.query(query, (err, results) => {
    if (err) {
      insertQuery({ author, query }, 0, conn);
      return callback(1, err.sqlMessage);
    }
    insertQuery({ author, query }, 1, conn);
    return callback(
      0,
      'Query lanzada con sucesso',
      results.affectedRows,
      results.changedRows,
    );
  });
}

export default executeQuery;
  

И мой файловый сервер.ts, где запрос, ответ.

 import express from 'express';
import mysql from 'mysql';
import cors from 'cors';
import config from './config/db';
import test from './services/test';

const app = express();
app.use(express.json());
app.use(cors());

app.get('/', (_, res) => {
  return res.json({ message: 'Hello World' });
});

// eslint-disable-next-line consistent-return
app.post('/query', (req, res) => {
  const { author, query } = req.body;

  if (author amp;amp; query) {
    const connection = mysql.createConnection(config);

    test({ author, query }, connection, (error, message, affected, changed) => {
      if (error === 1) {
        return res.status(400).json({
          error,
          mensaje: message,
          affectedRows: affected,
          changedRows: changed,
        });
      }

      return res.json({
        error,
        mensaje: message,
        affectedRows: affected,
        changedRows: changed,
      });
    });
  } else {
    return res.status(400).json({ error: 'Invalid parameters' });
  }
});

app.listen(3333, () => {
  console.log('🚀 Server runing');
});