Чтобы безопасно вставлять данные в таблицу в Node.js, следует использовать параметризованные SQL-запросы и избегать прямого объединения пользовательского ввода в SQL-запросы. Это помогает предотвратить атаки с внедрением SQL, когда злоумышленник может манипулировать пользовательским вводом для выполнения непреднамеренных команд SQL в вашей базе данных.

Вот пример использования параметризованных запросов для вставки данных в таблицу с помощью модуля mssql в Node.js:

const sql = require('mssql');

// Configuration object for connecting to the database
const config = {
  user: 'username',
  password: 'password',
  server: 'localhost',
  database: 'mydatabase'
};
// Define the data to insert
const apiName = 'My API';
const createdAt = new Date();

// Define the parameterized query
const query = 'INSERT INTO MyAPI (api_name, created_at) VALUES (@apiName, @createdAt)';

В этом примере модуль mssql используется для подключения к базе данных и выполнения запроса. Сам запрос определяется как строка с заполнителями параметров @apiName и @createdAt. Метод ввода используется для определения типов данных и значений параметров, а метод query используется для выполнения запроса с указанными параметрами.

Использование подобных параметризованных запросов помогает убедиться, что пользовательский ввод правильно экранируется и заключен в кавычки, а также предотвращает внедрение вредоносного кода SQL в запрос.

Теперь давайте создадим универсальные функции для безопасной вставки и чтения данных из любой таблицы в Node.js с помощью модуля mssql. Мы можем использовать параметризованные SQL-запросы для предотвращения атак SQL-инъекций. Вот пример:

// Function to insert data into a table
exports.insertData = async (tableName, data) => {
  try {
    const columns = Object.keys(data).join(', ');
    const values = Object.values(data);
    const placeholders = values.map((value, index) => `@${index}`).join(', ');
    const query = `INSERT INTO ${tableName} (${columns}) VALUES (${placeholders})`;
    const pool = await sql.connect(config);
    const request = pool.request();
    values.forEach((value, index) => {
      request.input(index.toString(), value);
    });
    const result = await request.query(query);
    return result;
  } catch (err) {
    console.log(err);
    throw err;
  }
} 
// Function to read data from a table
exports.readData = (tableName) => {
  try {
    const query = `SELECT * FROM ${tableName}`;
    const pool = await sql.connect(config);
    const result = await pool.request().query(query);
    return result.recordset;
  } catch (err) {
    console.log(err);
    throw err;
  }
}

В этом примере функция insertData использует параметризованные SQL-запросы для безопасной вставки данных в любую таблицу. Функция принимает имя таблицы и объект, содержащий данные для вставки в таблицу. Функция динамически генерирует SQL-запрос на основе имени таблицы и объекта данных, используя заполнители параметров, чтобы избежать прямого объединения пользовательского ввода в SQL-запросы. Метод input используется для определения типов данных и значений параметров, а метод query используется для выполнения запроса с указанными параметрами.

Эти функции можно использовать для безопасной вставки и чтения данных из любой таблицы в указанной базе данных путем вызова функций с соответствующими именем таблицы и данными. Например:

// Example usage
const tableName = 'MyTable';
const data = { name: 'Raj', age: 30, email: '[email protected]' };

// Insert data into the table
try{
  const insResponse = await insertData(tableName, data);
  if (insResponse.rowsAffected[0] === 1){
      return res.json({message: "Data Inserted Successfully"});
  }
}
catch (err) {
  return res.status(400).send(err);
}
// Read data from the table
try{
  const readResponse = await readData(tableName);
  return res.send(readResponse);
} catch (err) {
  return res.status(400).send(err);
}