【问题标题】:node js req.body empty return节点 js req.body 空返回
【发布时间】:2021-01-08 15:17:41
【问题描述】:

我有一个非常奇怪的问题,我已经用同样的方式做了一些表格,一切都很好.. 我会尽量给你一些代码:

后端路由器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;

后端控制器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 });
};

和前端形式:

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;

在应用程序 js 中,我已经需要聊天路由,并且我设置了标题和正文解析器,但在其他页面上非常奇怪,一切正常,但在这里我无法检索 req.body...

@我什至无法处理形成成功错误我得到:无效,请检查您的数据。我认为当我 console.log req 我看到 req.body 为空时,这个输入有问题......

【问题讨论】:

    标签: node.js reactjs mongodb


    【解决方案1】:

    您的快速服务器应用程序中需要某种请求负载解析器中间件。解析器实际上解析主体并在request 对象上创建一个名为body 的属性。通常对于以 JSON 作为请求体的 API,我们需要像这样使用bodyparser 中间件:

    import bodyParser from 'body-parser';
    
    // And then
    app.use(bodyParser.json());
    app.use(bodyParser.urlencoded({ extended: true }));
    

    但是如果你想使用多部分表单数据,那么你可以使用formidable作为中间件。

    【讨论】:

    • 我已经在我的 app.js - pastebin.com/aNHqmajK 中完成了那部分,这很奇怪,因为在其他形式中我一切正常,我得到 req.body 但在这个它是空的......跨度>
    • 我是否在我的示例中遗漏了什么,我仍然没有解决这个问题...
    【解决方案2】:

    这很奇怪,我将在这里发布我的 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);
      });
    

    我有和其他表单用于创建和更新,一切正常,但在我上次聊天中我无法检索 req.body.. 我使用 express-validator 获取 req.body...看起来我错过了一些东西在这里,我在第一篇文章中发布了其他文件的完整代码,所以如果有人可以帮助我,我会很满意..

    【讨论】:

      猜你喜欢
      • 2021-05-05
      • 2017-08-30
      • 2019-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-06
      • 2022-01-11
      • 1970-01-01
      相关资源
      最近更新 更多