【问题标题】:Cannot get objects' values from request body while trying to POST [Node.js, MySQL]尝试 POST [Node.js,MySQL] 时无法从请求正文中获取对象的值
【发布时间】:2019-12-28 16:34:58
【问题描述】:

我正在开发一个管理系统,目前正在为 api 创建 POST 请求。我需要请求正文的值才能在数据库中发布一个新城市。这些值在存储过程中用作参数。我得到的不是我输入的键值,而是一个“未定义”的值,有时是一个“[object Object]”。

我正在使用由 Google 服务托管在云中的 MySQL 服务器。后端使用 Node.js 制作,使用 Express 进行路由。我修复错误的尝试都没有为我工作。

到目前为止我已经尝试过:

-从正文中解析每个键的值 .toString() 和 JSON.stingfify()

-将正文转换为 Json/string,然后返回 javascript 对象

-获取响应的请求正文(res.req.body)

-在数组中获取主体的响应值,然后在将下一个元素作为参数传递给存储过程后推送它

-在调用 POST 方法时使用“请求”npm 扩展来放置我需要的值。

-更改了要存储在 URL 参数中而不是正文中的值。

-将正文的值作为表单数据、JSON 文件、HTML 页面发送

cityController.js 中的控制器方法:

exports.city_post = (req, res, next)=>{
  poolDb.getConnection(function (err, connection){
      if(!err) {
        const sql = 'CALL createNewCity(?,?)';
        var zipReq = req.params.zip; 
        var nameReq = req.params.name;
        var reqBody = JSON.stringify(req.res.body);
        connection.query(sql,[zipReq,nameReq], (err,rows)=>{
            if(!err){
                return res.status(201).json({Message: 'City with name: '+nameReq+' and zip code: '+zipReq+' created successfully\n', rows});
            }    
            else{
                return res.status(404).json({errorMessage: err})
            }
        });
        }
    else{
        return res.status(500).json({errorMessage: "server error: "+this.err});
    }
    console.log("\nZip Code: "+ zipReq +"\nName: " + nameReq); //for testing 
    console.log("\nrequest body: " + reqBody); //for testing
  });
}

市区路线:

const express = require('express');
const router = express.Router();
const CityController = require('../controllers/cityController.js');

router.get('/', CityController.city_getAll);

router.get('/:cityzip', CityController.city_getbyzip);

router.post('/add', CityController.city_post);

...

module.exports = router;

预期:在表城市中发布一个新字段,状态代码 (201)。

实际:状态代码 (404),数据库中没有新插入。 body、req.body.zip 和 req.body.name 的值是“未定义”。

截图:

-终端输出:https://imgur.com/a/brqKZlP

-邮递员请求:https://imgur.com/a/ZfFcX8Z

【问题讨论】:

  • 尝试 console.loging 出 req.params/req.query 属性以查看它们包含的内容(如果有)。可能以意想不到的方式格式化,尤其是收到“[object Object]”。

标签: javascript mysql node.js express request


【解决方案1】:

Express 默认不解析帖子正文(出于某种原因)。您可以尝试流行的 body-parser npm 包,或者如果您不想添加全新的包,则可以自己收集原始身体数据并从字符串中解析。这里作为快递应用:

app.use(function(req, res, next){
    var data = "";
    req.on('data', function(chunk){ data += chunk})
    req.on('end', function(){
        req.rawBody = data;
        var json = JSON.parse(req.rawBody); // assuming valid json. ideally check content-type first
        next();
    });
});

【讨论】:

  • 好答案。但是,当 body-parser 中间件包已经被彻底调试并透明地处理各种正文格式时,为什么还要创建自己的正文解析器呢? expressjs.com/en/resources/middleware/body-parser.html
  • @O.Jones 非常公平。老实说,很惊讶它现在还没有被折叠成快递。
  • 感谢分享,太聪明了。我已经尝试过类似的东西,但没有奏效。创建我自己的解析函数和使用 body-parser 扩展。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-15
  • 2013-12-21
  • 2022-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-27
相关资源
最近更新 更多