Как вставить элемент (документ/запись) в базу данных из Node.js-приложения?

Ответ

В Node.js для вставки данных используются ORM (Object-Relational Mapping) библиотеки или нативные драйверы баз данных. Вот как это выглядит на практике для разных БД.

1. MongoDB с Mongoose (ODM): Самый распространенный способ для MongoDB.

const mongoose = require('mongoose');

// 1. Определение схемы и модели
const userSchema = new mongoose.Schema({
  name: { type: String, required: true },
  email: { 
    type: String, 
    required: true, 
    unique: true, 
    lowercase: true 
  },
  createdAt: { type: Date, default: Date.now }
});
const User = mongoose.model('User', userSchema);

// 2. Вставка одного документа
async function createUser(userData) {
  try {
    // Создание экземпляра модели и сохранение
    const newUser = new User(userData);
    const savedUser = await newUser.save(); // Выполняет INSERT
    console.log('User created with ID:', savedUser._id);
    return savedUser;
  } catch (error) {
    // Обработка ошибок валидации или дубликатов
    if (error.code === 11000) {
      throw new Error('Пользователь с таким email уже существует');
    }
    throw error;
  }
}

// 3. Альтернатива: create() (краткая запись)
const user = await User.create({ name: 'John', email: 'john@example.com' });

// 4. Вставка нескольких документов
const users = await User.insertMany([
  { name: 'Alice', email: 'alice@example.com' },
  { name: 'Bob', email: 'bob@example.com' }
]);

2. PostgreSQL/MySQL с Sequelize (ORM):

const { Sequelize, DataTypes } = require('sequelize');
const sequelize = new Sequelize('database', 'username', 'password', {
  dialect: 'postgres',
  logging: false
});

// Определение модели
const User = sequelize.define('User', {
  name: { type: DataTypes.STRING, allowNull: false },
  email: { type: DataTypes.STRING, unique: true }
});

await sequelize.sync(); // Синхронизация модели с таблицей (в продакшене используем миграции)

// Вставка записи
const newUser = await User.create({
  name: 'Jane Doe',
  email: 'jane@example.com'
});
console.log('User created with ID:', newUser.id);

3. Нативный запрос с драйвером (например, mysql2 или pg): Прямые запросы используются для оптимизации или в простых сценариях.

const mysql = require('mysql2/promise'); // Используем promise-интерфейс

async function insertUser(name, email) {
  const connection = await mysql.createConnection(process.env.DATABASE_URL);

  try {
    // Параметризованный запрос для защиты от SQL-инъекций
    const [result] = await connection.execute(
      'INSERT INTO users (name, email) VALUES (?, ?)',
      [name, email]
    );
    console.log('Inserted ID:', result.insertId);
    return result.insertId;
  } finally {
    await connection.end(); // Всегда закрываем соединение
  }
}

Критически важные практики:

  • Всегда используйте асинхронные методы (await, .then()) для неблокирующих операций.
  • Параметризуйте все запросы при работе с реляционными БД, чтобы исключить SQL-инъекции.
  • Обрабатывайте ошибки через try/catch. Особое внимание — ошибкам уникальности (11000 в MongoDB, 23505 в PostgreSQL) и валидации.
  • Используйте пулы соединений (встроены в драйверы и ORM) для эффективного управления подключениями к БД в высоконагруженных приложениях.

Ответ 18+ 🔞

Ёпта, ну смотри, тут про вставку данных в Node.js, аж овердохуища способов. Всё зависит от того, в какую именно базу ты свои данные пихать собрался. Сейчас разберём, как это делается без лишнего геморроя.

1. MongoDB через Mongoose (это типа ODM для неё): Самый, блядь, распространённый вариант, если ты с монгой работаешь.

const mongoose = require('mongoose');

// 1. Сначала опишешь, как твоя сущность выглядит — схему, блядь.
const userSchema = new mongoose.Schema({
  name: { type: String, required: true },
  email: { 
    type: String, 
    required: true, 
    unique: true, 
    lowercase: true 
  },
  createdAt: { type: Date, default: Date.now }
});
const User = mongoose.model('User', userSchema);

// 2. Вставить один документ — проще пареной репы.
async function createUser(userData) {
  try {
    // Создал экземпляр и сохранил — всё, запись улетела в базу.
    const newUser = new User(userData);
    const savedUser = await newUser.save(); // Вот он, INSERT по-монговски
    console.log('User created with ID:', savedUser._id);
    return savedUser;
  } catch (error) {
    // А вот тут лови ошибки, если email уже занят или данные кривые.
    if (error.code === 11000) {
      throw new Error('Пользователь с таким email уже существует, ядрёна вошь!');
    }
    throw error;
  }
}

// 3. Можно короче, через create() — тоже норм.
const user = await User.create({ name: 'John', email: 'john@example.com' });

// 4. А если надо пачкой? insertMany() тебе в помощь.
const users = await User.insertMany([
  { name: 'Alice', email: 'alice@example.com' },
  { name: 'Bob', email: 'bob@example.com' }
]);

2. PostgreSQL или MySQL через Sequelize (это уже ORM): Тут уже ближе к классическим SQL-базам, но без этих ужасных строчек запросов.

const { Sequelize, DataTypes } = require('sequelize');
const sequelize = new Sequelize('database', 'username', 'password', {
  dialect: 'postgres', // или 'mysql'
  logging: false // чтобы в консоль не несло тонны мусора
});

// Описываешь модель — что за таблица будет.
const User = sequelize.define('User', {
  name: { type: DataTypes.STRING, allowNull: false },
  email: { type: DataTypes.STRING, unique: true }
});

await sequelize.sync(); // Это чтобы таблицу создать (в продакшене миграции, конечно, лучше).

// И вставляешь запись — одной строчкой, красота.
const newUser = await User.create({
  name: 'Jane Doe',
  email: 'jane@example.com'
});
console.log('User created with ID:', newUser.id);

3. Нативный запрос, напрямую драйвером (mysql2 или pg): А вот это для тех, кому ORM — как костыль, или когда надо выжать максимум скорости. Прям как в старые добрые времена, только с промисами.

const mysql = require('mysql2/promise'); // Обязательно промисный интерфейс, а то заебёшься.

async function insertUser(name, email) {
  const connection = await mysql.createConnection(process.env.DATABASE_URL);

  try {
    // Параметризованный запрос, ёпта! Чтобы никаких SQL-инъекций.
    const [result] = await connection.execute(
      'INSERT INTO users (name, email) VALUES (?, ?)',
      [name, email]
    );
    console.log('Inserted ID:', result.insertId);
    return result.insertId;
  } finally {
    await connection.end(); // Соединение закрывай всегда, а то ресурсы жрать будет.
  }
}

А теперь, чувак, главные правила, без которых — пиздец и боль:

  • Работай асинхронно. Только await или .then(). Заблокировать поток ввода-вывода — это просто моветон, доверия к такому коду — ноль ебать.
  • Параметризуй ВСЕ запросы к SQL. Серьёзно, если будешь строки склеивать, тебя взломают за пять минут, и будешь потом охуевать, откуда в базе таблица users удалилась. Защита от инъекций — это святое.
  • Ошибки обрабатывай. Оберни всё в try/catch. Особенно лови ошибки уникальности (в MongoDB это 11000, в PostgreSQL — 23505) и валидации данных. Игнорировать их — путь вникуда.
  • Используй пулы соединений. Они уже встроены в драйверы и ORM. Не открывай новое соединение на каждый чих — в высоконагруженном приложении база просто накроется медным тазом от таких подходов. Бери из пула, используй, возвращай.