简体   繁体   English

节点 js req.body 空返回

[英]node js req.body empty return

i have very strange problem i already did some forms in same way and everythin working fine.. I will try to give u some code:我有一个非常奇怪的问题,我已经以同样的方式做了一些 forms 并且一切正常。我会尝试给你一些代码:

backend router js:后端路由器js:

const express = require('express');
const { check } = require('express-validator');

const chatControllers = require('../controllers/chat-controllers');
const checkAuth = require('../middleware/check-auth');

const router = express.Router();

router.get('/', chatControllers.getChat);

router.use(checkAuth);

router.post(
  '/',
  [
    check('message')
      .not()
      .isEmpty()
  ],
  chatControllers.createChat
);

module.exports = router;

backend controller js:后端 controller js:

const createChat = async (req, res, next) => {
  const errors = validationResult(req);
  if (!errors.isEmpty()) {
    return next(
      new HttpError('Invalid, please check your data.', 422)
    );
  }

  const { message } = req.body;

  const createdChat = new Chat({
    message,
    creator: req.userData.userId
  });

  let user;
  try {
    user = await User.findById(req.userData.userId);
  } catch (err) {
    const error = new HttpError(
      'Creating message failed, please try again.',
      500
    );
    return next(error);
  }

  if (!user) {
    const error = new HttpError('Could not find user for provided id.', 404);
    return next(error);
  }

  try {
    const sess = await mongoose.startSession();
    sess.startTransaction();
    await createdChat.save({ session: sess });
  } catch (err) {
    const error = new HttpError(
      'Creating message failed, please try again.',
      500
    );
    return next(error);
  }

  res.status(201).json({ chat: createdChat });
};

and frontend form:和前端形式:

const Chat = () => {
  const auth = useContext(AuthContext);
  const { isLoading, error, sendRequest, clearError } = useHttpClient();
  const [formState, inputHandler] = useForm(
    {
      message: {
        value: '',
        isValid: false
      }
    },
    false
  );


  const chatSubmitHandler = async event => {
    event.preventDefault();
    try {
      const formData = new FormData();
      formData.append('message', formState.inputs.message.value);
      await sendRequest('http://localhost:5000/api/chat', 'POST', formData, {
        Authorization: 'Bearer ' + auth.token
      });
    } catch (err) {}
  };

  return (
    <React.Fragment>
      <Helmet>
        <title></title>
      </Helmet>
      
      <ErrorModal error={error} onClear={clearError} />

      <div className="container">
      <h1>CHAT</h1>
      <form className="chat-form" onSubmit={chatSubmitHandler}>

        <Input
          id="message"
          element="input"
          type="text"
          label="Message"
          validators={[VALIDATOR_REQUIRE()]}
          errorText="Please enter message."
          onInput={inputHandler}
        />

        <Button type="submit" disabled={!formState.isValid}>
          SEND
        </Button>
      </form>

      <div className="chat-body overflow-auto">
        message body
      </div>

      </div>
    </React.Fragment>
  );
};

export default Chat;

In app js i already required routes for chat, and also i set headers and body parser but its very strange on others page everything working fine but here i cant retrive req.body...在应用程序 js 中,我已经需要聊天路由,并且我设置了标题和正文解析器,但在其他页面上非常奇怪,一切正常,但在这里我无法检索 req.body ...

@ i cant even process to form success error i get: Invalid, please check your data. @我什至无法处理形成成功错误我得到:无效,请检查您的数据。 I think its problem with this input when i console.log req i see theres req.body empty...我认为当我 console.log req 我看到 req.body 为空时,它的输入有问题...

You need some kind of request payload parser middleware in your express server application.您的快速服务器应用程序中需要某种请求负载解析器中间件。 The parser actually parses the body and creates a property called body on the request object.解析器实际上解析主体并在request object 上创建一个名为body的属性。 Usually for APIs which take JSON as request body, we need to use bodyparser middleware like this:通常对于以 JSON 作为请求体的 API,我们需要像这样使用bodyparser中间件:

import bodyParser from 'body-parser';

// And then
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));

But if you want to use multipart form data, then you can use formidable as a middleware.但是如果你想使用多部分的表单数据,那么你可以使用formidable作为中间件。

This is like very very weird here i will post my app.js:这就像非常非常奇怪在这里我将发布我的 app.js:

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

const express = require('express');
const bodyParser = require('body-parser');
const mongoose = require('mongoose');

const companiesRoutes = require('./routes/companies-routes');
const usersRoutes = require('./routes/users-routes');
const adsRoutes = require('./routes/ads-routes');
const chatRoutes = require('./routes/chat-routes');
const HttpError = require('./models/http-error');
const { check } = require('express-validator');

const app = express();
const server = require("http").createServer(app);
const io = require("socket.io")(server, {
  cors: {
    origin: "http://localhost:3000",
    methods: ["GET", "POST"],
    credentials: true
  }
});

app.use(bodyParser.json());

app.use('/uploads/images', express.static(path.join('uploads', 'images')));
app.use('/uploads/videos', express.static(path.join('uploads', 'videos')));

app.use((req, res, next) => {
  res.setHeader('Access-Control-Allow-Origin', '*');
  res.setHeader(
    'Access-Control-Allow-Headers',
    'Origin, X-Requested-With, Content-Type, Accept, Authorization'
  );
  res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PATCH, DELETE');

  next();
});

app.use('/api/companies', companiesRoutes);
app.use('/api/users', usersRoutes);
app.use('/api/ads', adsRoutes);
app.use('/api/chat', chatRoutes);

app.use((req, res, next) => {
  const error = new HttpError('Could not find this route.', 404);
  throw error;
});

app.use((error, req, res, next) => {
  if (req.file) {
    fs.unlink(req.file.path, err => {
      console.log(err);
    });
  }
  if (res.headerSent) {
    return next(error);
  }
  res.status(error.code || 500);
  res.json({ message: error.message || 'An unknown error occurred!' });

}); 

mongoose
  .connect('mongodburllink', { useNewUrlParser: true })
  .then(() => {
    server.listen(5000);
  })
  .catch(err => {
    console.log(err);
  });

i have and others forms for create and update and everything work fine, but in my last chat i cant retrive req.body.. And i use express-validator for getting req.body... It looks like im missing something here i post in first post full code of other files so if somebody can help i will be thanfull..我有和其他 forms 用于创建和更新,一切正常,但在我上次聊天中我无法检索 req.body .. 我使用 express-validator 来获取 req.body ......看起来我在这里错过了一些东西在第一次发布其他文件的完整代码中,所以如果有人可以帮助我,我会很高兴..

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM