我正在管理系统上,当前正在为api创建POST请求。我需要请求正文的值才能在数据库中发布新城市。这些值在存储过程中用作参数。代替我输入的键值,我得到的是“未定义”值,有时是“ [对象对象]”。
我正在使用由Google服务托管在云中的MySQL服务器。后端是由Node.js构成的,而Express是由路由的。我修复该bug的尝试都没有对我有用。
到目前为止,我已经尝试过:
-从主体解析每个键的值.toString()和JSON.stingfify()
-将主体转换为Json / string,然后返回到javascript对象
-获取响应的请求的正文(res.req.body)
-在数组中获取主体的响应值,然后在将下一个元素作为参数传递给存储过程后推入下一个元素
-在调用POST方法时,使用“ request” 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),数据库中没有新插入。正文,req.body.zip和req.body.name的值为“未定义”。
屏幕截图:
-终端输出:https : //imgur.com/a/brqKZlP
-邮递员请求:https ://imgur.com/a/ZfFcX8Z
好的,从标头传递变量信息不是一个好习惯。
我设置了中间件bodyParser,以便它接受json数据,还为urlencoded扩展提供了一个假值。
现在它可以正常工作,所有HTTP请求都像超级按钮一样执行,将我需要的信息传递到正文中,而不是标题中-正确的方式。
所以我只是在app.js文件中添加了它:
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: false}));
另外,在邮递员或任何其他测试环境中,请确保选择x-www-form-urlencoded
,form data
或选择raw
用于正文。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句