当前位置: 首页 > 知识库问答 >
问题:

上载图像时,Node/Express无法发布错误(React frontend

元景天
2023-03-14

我是Node.js的新手,我正在尝试运行一个MERN电影票预订系统。前端中的以下代码段表示为特定电影上传图像的函数:

null

export const uploadMovieImage = (id, image) => async dispatch => {
  try {
    const data = new FormData();
    data.append('file', image);
      const url = '/movies/photo/' + id;
      console.log(url);
    const response = await fetch(url, {
      method: 'POST',
      body: data
    });
      console.log(response);
      const responseData = await response.json();
      console.log(responseData);
    if (response.ok) {
      dispatch(setAlert('Image Uploaded', 'success', 5000));
    }
      if (responseData.error) {
          console.log("error 2");
      dispatch(setAlert(responseData.error.message, 'error', 5000));
    }
  } catch (error) {
      console.log("error");
 
    dispatch(setAlert(error.message, 'error', 5000));
  }
};

null

这是我在服务器端的index.js:

null

const express = require('express');
const path = require('path');

if (process.env.NODE_ENV !== 'production') {
  require('dotenv').config({ path: path.join(__dirname, '../.env') });
}

require('./db/mongoose');

// Routes
const userRouter = require('./routes/users');
const movieRouter = require('./routes/movies');
const cinemaRouter = require('./routes/cinema');
const showtimeRouter = require('./routes/showtime');
const reservationRouter = require('./routes/reservation');
const invitationsRouter = require('./routes/invitations');

const app = express();
app.disable('x-powered-by');
const port = process.env.PORT || 8080;

// Serve static files from the React app
app.use(express.static(path.join(__dirname, '../../../client/build')));
app.use('/uploads', express.static(path.join(__dirname, '../uploads')));

app.use(function(req, res, next) {
  // Website you wish to allow to connect
  res.setHeader('Access-Control-Allow-Origin', '*');

  // Request methods you wish to allow
  res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');

  // Request headers you wish to allow
  res.setHeader(
    'Access-Control-Allow-Headers',
    'Access-Control-Allow-Headers, Origin,Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers,X-Access-Token,XKey,Authorization'
  );

  //  res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");

  // Pass to next layer of middleware
  next();
});
app.use(express.json());
app.use(userRouter);
app.use(movieRouter);
app.use(cinemaRouter);
app.use(showtimeRouter);
app.use(reservationRouter);
app.use(invitationsRouter);

 //app.get('/api/test', (req, res) => res.send('Hello World'))

// The "catchall" handler: for any request that doesn't
// match one above, send back React's index.html file.
//app.use(bodyParser.urlencoded({ extended: false }))
app.get('/*', (req, res) => {
  res.sendFile(path.join(__dirname + '../../../client/build/index.html'));
});
app.listen(port, () => console.log(`app is running in PORT: ${port}`));

null

下面是路由器的代码段。/routes/movies

null

// Create a movie
router.post('/movies', auth.enhance, async (req, res) => {
  const movie = new Movie(req.body);
  try {
    await movie.save();
    res.status(201).send(movie);
  } catch (e) {
    res.status(400).send(e);
  }
});

router.get(
  '/movies/photo/:id',
  auth.enhance,
  upload('movies').single('file'),
  async (req, res, next) => {
      const url = `${req.protocol}://${req.get('host')}`;
      console.log(url);
    const { file } = req;
    const movieId = req.params.id;
    try {
      if (!file) {
        const error = new Error('Please upload a file');
        error.httpStatusCode = 400;
        return next(error);
      }
      const movie = await Movie.findById(movieId);
      if (!movie) return res.sendStatus(404);
      movie.image = `${url}/${file.path}`;
      await movie.save();
      res.send({ movie, file });
    } catch (e) {
      console.log(e);
      res.sendStatus(400).send(e);
    }
  }
);

null

图像无法上传,当我运行inspect/console时,它会在这里显示enter image description

共有1个答案

李敏学
2023-03-14

您正在向/movies/photo/someid发出POST请求

您的POST处理程序用于/movies并且位于注册到/movies的路由器上,因此您需要向其发出POST请求的URL是/movies/movies

您需要使您的URL匹配!

 类似资料:
  • 我在Python中的Selenium webdriver上遇到了一个图像上传问题,我检查了HTML并使用完整的Xpath来定位元素,但没有工作。我仍然收到此错误selenium.common.exceptions.nosuchelementexception:消息:没有这样的元素:找不到元素:{“method”:“XPath”,“selector”:“/html/body/div[2]/div/d

  • 问题内容: 我正在尝试使用express创建一个简单的表单处理程序。我为表单尝试了以下代码: 这是我的app.js代码: 提交表单后,我不断收到错误消息“ CANNOT POST /”。我是否缺少类似模块的内容? 问题答案: 这样你应该尝试 您将来应该记住的事情参考: 您将url编码扩展为true 您没有任何要求获取表格的请求 您正在使用HTML命名变量,这是不良做法之一 谢谢与欢呼

  • 我无法上载firebase存储上的配置文件图像。我正在把烤面包片上的错误打印出来。为什么会出现这种情况?我无法解决这个问题,我审查了我的代码很多次。问题可能是什么?我如何调整我的代码以使其正常工作?提前向大家表示感谢。

  • 我正在开发我的第一个MERN stack网络应用程序。我完成了开发并尝试在VPS中托管。一切正常。但是,我无法查看上传的图像。我与您分享关于项目结构的几个细节。 React应用程序是为生产而生成,并保存在公用文件夹中。 上载文件夹创建,用户上载的图像保存在其中,其位置存储在DB中。(例如:/uploads/user1/img1.jpg)。使用Multer处理图像上载。 我可以访问我的web应用程序

  • 我试图上传一个图像从本地使用bas64做图像检测。 和一切正常工作在localhost和邮递员。 但部署后,我得到了CROS错误。 我已经在 cors中间件在使用url获取图像时工作正常, 但是当我试图使用bas64从本地上传图像时,控制台显示: 这是我尝试过的解决方案: cors-任何地方 然后显示。 由于在localhost和postman中测试时没有错误,我发现一些文章说这可能仍然是cors

  • 为什么我上传新图片时不能删除我的旧图片? 这是我用来存储数据和图像的控制器。我的文件图像名由nama_post_adps和$imageName组合存储,其中$imageName是对