【问题标题】:Doubts with mysql, typescript and nodejs对 mysql、typescript 和 nodejs 的质疑
【发布时间】:2020-09-29 20:11:15
【问题描述】:

我是 Typescript 和 NodeJS 的新手。

我正在尝试使用带有 typescript 的 mysql 和 nodejs 来解决问题,但我遇到了一些困难。 基本上我的程序要做的是通过 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 && 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;

【问题讨论】:

  • 你在哪里调用executeQuery函数?
  • @SlavaRozhnev 在我的请求代码中我从服务/测试导入测试,并在此文件中导出函数 executeQuery。

标签: mysql node.js typescript


【解决方案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;

我的文件 server.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 && 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');
});

【讨论】:

    猜你喜欢
    • 2013-12-22
    • 2014-10-10
    • 2015-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-13
    • 2020-08-01
    • 2015-01-01
    相关资源
    最近更新 更多