Невозможно опубликовать файл изображения на сервере Express с помощью Angular 18.0.6

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

В настоящее время я разрабатываю приложение Angular (18.0.6) и пытаюсь реализовать CRUD, используя express и mysql. Я пытаюсь реализовать функцию загрузки файлов с помощью Multer. Я искал документацию и писал коды, но я действительно не понимаю, что, черт возьми, происходит.

Вот сервисные компоненты. Данные файла находятся в «наклейке». Я убедился, что данные файла можно отобразить в консоли.

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs';

@Injectable({
  providedIn: 'root'
})
export class PutstickerService {
  private uploadUrl = 'http://localhost:3000/putNewSticker';

  constructor(private http: HttpClient) { }

  uploadImage(sticker: File): Observable<any> {
    console.info(sticker);
    const data = new FormData();
    data.append('sticker', sticker, sticker.name);
    return this.http.post<any>(this.uploadUrl, data);
  }
}

И затем, это файл mjs, который получает FormData и отправляет данные в MySQL.

import express from 'express';
import connection from '../config/database.mjs';
import multer from 'multer';
import path from 'path';

const router = express.Router();

const storage = multer.diskStorage({
    destination: function (req, file, cb) {
        cb(null, 'public/uploads/');
    },
    filename: function (req, file, cb) {
        cb(null, Date.now() + path.extname(file.originalname)); // Adds a timestamp to avoid filename conflicts
    }
});

const upload = multer({ storage: storage });

router.get('/test', (req, res) => {
    console.info("test");
});

router.post('/putNewSticker', upload.single('sticker'), (req, res) => {
    if (!req.file) {
        return res.status(400).send('No file uploaded.');
    }

    console.info(`File uploaded: ${req.file.filename}`);
    const filePath = req.file.path.replace('public/', '');
    const sql = 'INSERT INTO stickers (sticker) VALUES (?)';

    connection.query(sql, [filePath], (err, result) => {
        if (err) {
            console.error('Error inserting image path to MySQL:', err);
            return res.status(500).send('Internal Server Error');
        }

        res.send({ message: 'Image uploaded successfully', path: filePath });
    });
});

export default router;

Я помещаю console.info, но в терминале ничего не отображается. Так что я думаю этот путь даже не читал. Я убедился, что «/test» может работать. поэтому я не думаю, что весь этот файл неправильный. около Мультера или почтового индекса.

Я впервые задаю вопрос, поэтому, если вам нужна дополнительная информация, сообщите мне.

Я ожидаю понять, почему путь «/putNewSticker» не может быть прочитан при чтении пути «/test». Я не смогу продолжать развиваться, если у меня не будет ошибок или чего-то в этом роде. Это просто не работает.

Мне действительно нужна помощь. Большое спасибо.

ОТРЕДАКТИРОВАНО

Вот как я монтирую роутер.

import express from 'express';
import path from 'path';
import cors from 'cors';
import bodyParser from 'body-parser';
import { fileURLToPath } from 'url';
import { dirname } from 'path';

import indexRouter from './routes/index.mjs';
import usersRouter from './routes/users.mjs';
import stickersRouter from './routes/stickers.mjs';
import putStickerRouter from './routes/putSticker.mjs';

const app = express();

const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);

app.use(bodyParser.json());
app.use(cors());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', indexRouter);
app.use('/', usersRouter);
app.use('/', stickersRouter);
app.use('/', putStickerRouter);

const port = 3000;
app.listen(port, () => {
    console.info(`Server running on port ${port}`);
});

добавьте обработчик ошибок при вызове uploadImage, а также на сервере, как вы монтируете этот маршрутизатор, это app.use('/', fileHandler) или что-то еще.. вы можете включить эту часть кода

traynor 14.07.2024 13:09

Привет! Просто для тестирования удалите multer из маршрута /putNewSticker и посмотрите, что он попадает. Если не попадает, то вы знаете, какой должна быть недостающая точка.

WeDoTheBest4You 15.07.2024 05:11

@traynor Я добавил обработчик ошибок, но внутри ничего не произошло. и я добавил, как я монтирую маршрутизатор, в своем вопросе.

近藤亮太 15.07.2024 09:05

проблема в том, что вы монтируете несколько обработчиков маршрутов на одном и том же маршруте: /, и поскольку порядок имеет значение (те, которые загружены первыми, запускаются первыми), скорее всего, первое промежуточное программное обеспечение - indexRouter - поглощает все запросы, никогда не достигая обработчика стикеров, скорее всего он ожидает... попробуйте изменить пути маршрутов для каждого маршрута, например: app.use('/users', usersRouter); app.use('/stickers', putStickerRouter); и т. д., и запросите URL-адрес соответственно: private uploadUrl = 'http://localhost:3000/stickers/putNewSticker'; и т. д.

traynor 15.07.2024 09:19

@WeDoTheBest4Привет! Я сделал это, но ничего не изменилось. так что проблема была не в мультере.

近藤亮太 15.07.2024 15:40

@traynor эй, я очень ценю!!

近藤亮太 15.07.2024 16:03

Привет. Спасибо за ответ. Как вы знаете, это очень распространенный метод тестирования — изолируйте подозрительный код и протестируйте.

WeDoTheBest4You 16.07.2024 06:55

@WeDoTheBest4You, я вижу. Большое спасибо!

近藤亮太 20.07.2024 03:50
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
8
68
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема на сервере: вы монтируете несколько обработчиков маршрутов на одном и том же маршруте: /, и поскольку порядок имеет значение (те, которые загружены первыми, запускаются первыми), скорее всего, первое промежуточное программное обеспечение - indexRouter - поглощает все запросы, никогда не достигая обработчика stickers. , скорее всего, он завершает ответ или ожидает ответа, если нет.

Итак, попробуйте изменить пути маршрутов для каждого маршрута, например:

app.use('/', indexRouter);
app.use('/users', usersRouter);
app.use('/stickers', stickersRouter);
app.use('/put-stickers', putStickerRouter);

и запросите URL-адреса соответственно:

private uploadUrl = 'http://localhost:3000/put-stickers/putNewSticker';

видеть:

Порядок загрузки промежуточного программного обеспечения важен: функции промежуточного программного обеспечения те, которые загружаются первыми, также выполняются первыми.

Если myLogger загружается после маршрута к корневому пути, запрос никогда не достигает его, и приложение не печатает «LOGGED», потому что маршрут обработчик корневого пути завершает цикл запрос-ответ.

Написание промежуточного программного обеспечения для использования в приложениях Express

Это решило!! Я правда вам огромное спасибо!!

近藤亮太 15.07.2024 15:36

Другие вопросы по теме