MST

星途 面试题库

面试题:Next.js API Routes如何与数据库集成以构建完整的RESTful API

使用Next.js的API Routes构建一个用于用户管理的RESTful API,要求实现创建用户(POST请求,数据存入数据库)、获取单个用户(GET请求,根据ID从数据库获取)、更新用户(PUT请求,更新数据库中的用户信息)和删除用户(DELETE请求,从数据库删除用户记录)的功能。假设使用MySQL数据库,简述整体架构思路并给出关键代码片段。
23.5万 热度难度
前端开发Next.js

知识考点

AI 面试

面试题答案

一键面试

整体架构思路

  1. 数据库连接:使用合适的MySQL连接库(如mysql2)在应用程序启动时建立与MySQL数据库的连接。
  2. API Routes:利用Next.js的API Routes功能,为每个用户管理操作创建对应的路由处理函数。这些函数将负责接收HTTP请求,处理业务逻辑,并与数据库进行交互。
  3. 请求处理
    • 创建用户(POST):从请求体中提取用户数据,验证数据格式,然后将数据插入到MySQL数据库中。
    • 获取单个用户(GET):从请求参数中获取用户ID,查询数据库获取对应用户信息。
    • 更新用户(PUT):从请求体中提取更新数据和用户ID,验证数据,然后更新数据库中对应ID的用户记录。
    • 删除用户(DELETE):从请求参数中获取用户ID,从数据库中删除对应ID的用户记录。

关键代码片段

  1. 数据库连接(可以放在lib/db.js
import mysql from'mysql2';

const pool = mysql.createPool({
  host: process.env.DB_HOST,
  user: process.env.DB_USER,
  password: process.env.DB_PASSWORD,
  database: process.env.DB_NAME,
  waitForConnections: true,
  connectionLimit: 10,
  queueLimit: 0
});

export const query = (sql, values) => {
  return new Promise((resolve, reject) => {
    pool.query(sql, values, (error, results, fields) => {
      if (error) {
        return reject(error);
      }
      resolve({ results, fields });
    });
  });
};
  1. 创建用户(pages/api/users/create.js
import { query } from '../../../lib/db';

export default async function handler(req, res) {
  if (req.method!== 'POST') {
    return res.status(405).json({ message: 'Method Not Allowed' });
  }
  const { name, email } = req.body;
  const sql = 'INSERT INTO users (name, email) VALUES (?,?)';
  try {
    const result = await query(sql, [name, email]);
    res.status(201).json({ message: 'User created successfully', id: result.results.insertId });
  } catch (error) {
    res.status(500).json({ message: 'Error creating user', error });
  }
}
  1. 获取单个用户(pages/api/users/[id].js
import { query } from '../../../lib/db';

export default async function handler(req, res) {
  const { id } = req.query;
  if (req.method === 'GET') {
    const sql = 'SELECT * FROM users WHERE id =?';
    try {
      const result = await query(sql, [id]);
      if (result.results.length === 0) {
        return res.status(404).json({ message: 'User not found' });
      }
      res.status(200).json(result.results[0]);
    } catch (error) {
      res.status(500).json({ message: 'Error fetching user', error });
    }
  } else {
    res.status(405).json({ message: 'Method Not Allowed' });
  }
}
  1. 更新用户(pages/api/users/update.js
import { query } from '../../../lib/db';

export default async function handler(req, res) {
  if (req.method!== 'PUT') {
    return res.status(405).json({ message: 'Method Not Allowed' });
  }
  const { id, name, email } = req.body;
  const sql = 'UPDATE users SET name =?, email =? WHERE id =?';
  try {
    const result = await query(sql, [name, email, id]);
    if (result.results.affectedRows === 0) {
      return res.status(404).json({ message: 'User not found' });
    }
    res.status(200).json({ message: 'User updated successfully' });
  } catch (error) {
    res.status(500).json({ message: 'Error updating user', error });
  }
}
  1. 删除用户(pages/api/users/delete/[id].js
import { query } from '../../../lib/db';

export default async function handler(req, res) {
  const { id } = req.query;
  if (req.method === 'DELETE') {
    const sql = 'DELETE FROM users WHERE id =?';
    try {
      const result = await query(sql, [id]);
      if (result.results.affectedRows === 0) {
        return res.status(404).json({ message: 'User not found' });
      }
      res.status(200).json({ message: 'User deleted successfully' });
    } catch (error) {
      res.status(500).json({ message: 'Error deleting user', error });
    }
  } else {
    res.status(405).json({ message: 'Method Not Allowed' });
  }
}

假设数据库中有一个users表,表结构如下:

CREATE TABLE users (
  id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(255) NOT NULL,
  email VARCHAR(255) NOT NULL
);