#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');
});