CastError:路径中值“未定义”的数字转换失败
Posted
技术标签:
【中文标题】CastError:路径中值“未定义”的数字转换失败【英文标题】:CastError: Cast to number failed for value "undefined" at path 【发布时间】:2018-03-16 19:26:35 【问题描述】:我有一个小问题要理解在这里做什么。我正在学习 nodejs 和 mongodb/mongoose。只是为了学习,我正在构建一个小页面来更新我的数据库中的文档。首先,我从一个选择中选择两个团队,然后我从输入中插入数据,然后我想将它们保存在数据库中。在前端,我的控制器是这样的:
FootballNumbers.controller('teamController', function($scope, $route, $routeParams, $http)
$http.get('/api/teams').then(function(response)
$scope.teams = response.data;
console.log(response.data);
);
$scope.aggiornaDB = function(squadra1,squadra2)
console.log(squadra1);
console.log(squadra2);
for(i=0; i<$scope.teams.length; i++)
for (j=0; j<$scope.teams.length;j++)
if($scope.teams[i].Nome==squadra1)
if($scope.teams[j].Nome==squadra2)
console.log($scope.teams[i].Nome);
console.log($scope.teams[j].Nome);
var Classifica = $scope.Classifica;
var ClassificaCasa = $scope.ClassificaCasa;
var ClassificaTrasferta = $scope.ClassificaTrasferta;
var Classifica2 = $scope.Classifica2;
var ClassificaCasa2 = $scope.ClassificaCasa2;
var ClassificaTrasferta2 = $scope.ClassificaTrasferta2
var Forma = $scope.Forma;
var Forma2 = $scope.Forma2;
var PartiteGiocate = $scope.teams[i].PartiteGiocate + 1;
var PartiteGiocateCasa = $scope.teams[i].GiocateCasa + 1;
var PartiteGiocate2 = $scope.teams[j].PartiteGiocate + 1;
var PartiteGiocateTrasferta = $scope.teams[j].GiocateTrasferta + 1;
var Vinte = $scope.teams[i].Vinte;
var VinteCasa = $scope.teams[i].VinteCasa;
var Perse2 = $scope.teams[j].Perse ;
var PerseTrasferta= $scope.teams[j].PerseTrasferta ;
var Pareggiate = $scope.teams[i].Pareggiate ;
var PareggiateCasa = $scope.teams[i].PareggiateCasa ;
var Pareggiate2 = $scope.teams[j].Pareggiate ;
var PareggiateTrasferta = $scope.teams[j].PareggiateTrasferta ;
var Perse = $scope.teams[i].Perse ;
var PerseCasa = $scope.teams[i].PerseCasa ;
var Vinte2 = $scope.teams[j].Vinte ;
var VinteTrasferta = $scope.teams[j].VinteTrasferta ;
if($scope.GolCasa > $scope.GolTrasferta)
Vinte = $scope.teams[i].Vinte + 1;
VinteCasa = $scope.teams[i].VinteCasa + 1;
Perse2 = $scope.teams[j].Perse + 1;
PerseTrasferta= $scope.teams[j].PerseTrasferta + 1;
else if($scope.GolCasa == $scope.GolTrasferta)
Pareggiate = $scope.teams[i].Pareggiate + 1;
PareggiateCasa = $scope.teams[i].PareggiateCasa + 1;
Pareggiate2 = $scope.teams[j].Pareggiate + 1;
PareggiateTrasferta = $scope.teams[j].PareggiateTrasferta + 1;
else
Perse = $scope.teams[i].Perse + 1 ;
PerseCasa = $scope.teams[i].PerseCasa + 1 ;
Vinte2 = $scope.teams[j].Vinte + 1;
VinteTrasferta = $scope.teams[j].VinteTrasferta + 1;
var SommaGol = $scope.GolCasa + $scope.GolTrasferta;
var MediaGol = (($scope.teams[i].MediaGol * $scope.teams[i].PartiteGiocate) + SommaGol)/ PartiteGiocate;
var MediaGol2 = (($scope.teams[j].MediaGol * $scope.teams[j].PartiteGiocate) + SommaGol)/ PartiteGiocate2;
var Over1 = $scope.teams[i].Over1 ;
var Over1Casa = $scope.teams[i].Over1Casa ;
var Over1T= $scope.teams[j].Over1 ;
var Over1Trasferta = $scope.teams[j].Over1Trasferta ;
if(SommaGol>1)
Over1 = $scope.teams[i].Over1 + 1;
Over1Casa = $scope.teams[i].Over1Casa + 1;
Over1T= $scope.teams[j].Over1 + 1;
Over1Trasferta = $scope.teams[j].Over1Trasferta + 1;
var Over2 = $scope.teams[i].Over2;
var Over2Casa = $scope.teams[i].Over2Casa;
var Over2T= $scope.teams[j].Over2;
var Over2Trasferta = $scope.teams[j].Over2Trasferta;
if(SommaGol>2)
Over2 = $scope.teams[i].Over2 + 1;
Over2Casa = $scope.teams[i].Over2Casa + 1;
Over2T= $scope.teams[j].Over2 + 1;
Over2Trasferta = $scope.teams[j].Over2Trasferta + 1;
var GolSegnati = $scope.teams[i].GolSegnati ;
var GolSegnatiCasa = $scope.teams[i].GolSegnatiCasa ;
var GolSubitiTrasferta = $scope.teams[j].GolSubitiTrasferta ;
var GolSubiti2 = $scope.teams[j].GolSubiti ;
if ($scope.GolCasa>0)
GolSegnati = $scope.teams[i].GolSegnati + 1;
GolSegnatiCasa = $scope.teams[i].GolSegnatiCasa + 1;
GolSubitiTrasferta = $scope.teams[j].GolSubitiTrasferta + 1;
GolSubiti2 = $scope.teams[j].GolSubiti + 1;
var GolSubiti = $scope.teams[i].GolSubiti ;
var GolSubitiCasa = $scope.teams[i].GolSubitiCasa ;
var GolSegnatiTrasferta = $scope.teams[j].GolSegnatiTrasferta;
var GolSegnati2 = $scope.teams[j].GolSegnati ;
if ($scope.GolTrasferta>0)
GolSubiti = $scope.teams[i].GolSubiti + 1;
GolSubitiCasa = $scope.teams[i].GolSubitiCasa + 1;
GolSegnatiTrasferta = $scope.teams[j].GolSegnatiTrasferta + 1;
GolSegnati2 = $scope.teams[j].GolSegnati + 1;
$http.put('/api/teams/update/' + $scope.teams[i]._id,
params:
'Classifica': Classifica,
'ClassificaCasa': ClassificaCasa,
'ClassificaTrasferta': ClassificaTrasferta,
"Forma": Forma,
"PartiteGiocate": PartiteGiocate,
"PartiteGiocateCasa": PartiteGiocateCasa,
"VinteCasa": VinteCasa,
"Vinte": Vinte,
"Pareggiate": Pareggiate,
"PareggiateCasa": Pareggiate,
"Perse": Perse,
"PerseCasa": PerseCasa,
"MediaGol": MediaGol,
"Over1": Over1,
"Over1Casa": Over1Casa,
"Over2": Over2,
"Over2Casa": Over2Casa,
"GolSegnati": GolSegnati,
"GolSegnatiCasa": GolSegnatiCasa,
"GolSubiti": GolSubiti,
"GolSubitiCasa": GolSubitiCasa
);
$http.put('/api/teams/update2/' + $scope.teams[j]._id,
params:
'Classifica2': Classifica2,
'ClassificaCasa2': ClassificaCasa2,
'ClassificaTrasferta2': ClassificaTrasferta2,
"Forma2": Forma2,
"PartiteGiocate2": PartiteGiocate2,
"PartiteGiocateTrasferta": PartiteGiocateTrasferta,
"VinteTrasferta": VinteTrasferta,
"Vinte2": Vinte2,
"Pareggiate2": Pareggiate2,
"PareggiateTrasferta": PareggiateTrasferta,
"Perse2": Perse2,
"PerseTrasferta": PerseTrasferta,
"MediaGol2": MediaGol2,
"Over1T": Over1T,
"Over1Trasferta": Over1Trasferta,
"Over2T": Over2T,
"Over2Trasferta": Over2Trasferta,
"GolSegnati2": GolSegnati2,
"GolSegnatiTrasferta": GolSegnatiTrasferta,
"GolSubiti2": GolSubiti2,
"GolSubitiTrasferta": GolSubitiTrasferta
)
.then(function ()
alert('Teams updated')
)
);
我的收藏名为“Teams”,这是我的后端:
var express = require('express');
var bodyParser = require('body-parser');
var app = express();
var mongoose = require('mongoose');
var ObjectId = mongoose.Schema.Types.ObjectId;
mongoose.connect('mongodb://localhost:27017/FootballNumbers', function(err)
if(err)
console.log(err);
else
console.log("db connected")
);
var db = mongoose.connection;
var teamsSchema = mongoose.Schema(
"_id": type: ObjectId,
"Nome" : type: String,
"Paese" : type: String,
"Bandiera" : type: String,
"Stemma" : type: String,
"Campionato" : type: String,
"Classifica" : type: Number,
"ClassificaCasa" : type: Number,
"ClassificaTrasferta" : type: Number,
"PartiteGiocate" : type: Number,
"Vinte" : type: Number,
"Pareggiate" : type: Number,
"Perse" : type: Number,
"GiocateCasa" : type: Number,
"VinteCasa" : type: Number,
"PareggiateCasa" : type: Number,
"PerseCasa" : type: Number,
"GiocateTrasferta" : type: Number,
"VinteTrasferta" : type: Number,
"PareggiateTrasferta" : type: Number,
"PerseTrasferta" : type: Number,
"Forma" : type: Number,
"MediaGol" : type: Number,
"Over1" : type: Number,
"Over2" : type: Number,
"Over1Casa" : type: Number,
"Over2Casa" : type: Number,
"Over1Trasferta" : type: Number,
"Over2Trasferta" : type: Number,
"GolSegnati" : type: Number,
"GolSegnatiCasa" : type: Number,
"GolSegnatiTrasferta" : type: Number,
"GolSubiti" : type: Number,
"GolSubitiCasa" : type: Number,
"GolSubitiTrasferta" : type: Number,
,
collection : 'Teams' );
var Team = mongoose.model('Team', teamsSchema);
app.use(bodyParser.urlencoded(extended: true));
app.use(bodyParser.json());
app.use(express.static(__dirname + '/client'));
app.get('/api/teams', function(req, res)
Team.find(function (err, data)
if (err) return console.error(err);
res.json(data);
)
);
/* UPDATE team*/
app.put('/api/teams/update/:_id', function(req, res)
Team.update("_id": req.params._id , $set: "Classifica" : req.params.Classifica,
"ClassificaCasa":req.params.ClassificaCasa,
"ClassificaTrasferta":req.params.ClassificaTrasferta,
"PartiteGiocate": req.params.PartiteGiocate,
"GiocateCasa": req.params.PartiteGiocateCasa,
"Vinte": req.params.Vinte,
"Pareggiate": req.params.Pareggiate,
"Perse": req.params.Perse,
"VinteCasa": req.params.VinteCasa,
"PareggiateCasa": req.params.PareggiateCasa,
"PerseCasa": req.params.PerseCasa,
"Forma": req.params.Forma,
"MediaGol": req.params.MediaGol,
"Over1": req.params.Over1,
"Over2": req.params.Over2,
"Over1Casa": req.params.Over1Casa,
"Over2Casa": req.params.Over2Casa,
"GolSegnati": req.params.GolSegnati,
"GolSegnatiCasa": req.params.GolSegnatiCasa,
"GolSubiti": req.params.GolSubiti,
"GolSubitiCasa": req.params.GolSubitiCasa
,function(err, teams)
if(err)
console.log(err);
res.status(500).send(err);
else
res.status(200).send(teams);
);
);
app.put('/api/teams/update2/:_id', function(req, res)
Team.update("_id": req.params._id2 , $set: "Classifica" : req.params.Classifica2,
"ClassificaCasa":req.params.ClassificaCasa2,
"ClassificaTrasferta":req.params.ClassificaTrasferta2,
"PartiteGiocate": req.params.PartiteGiocate2,
"GiocateTrasferta": req.params.PartiteGiocateTrasferta,
"Vinte": req.params.Vinte2,
"Pareggiate": req.params.Pareggiate2,
"Perse": req.params.Perse2,
"VinteTrasferta": req.params.VinteTrasferta,
"PareggiateTrasferta": req.params.PareggiateTrasferta,
"PerseTrasferta": req.params.PerseTrasferta,
"Forma": req.params.Forma2,
"MediaGol": req.params.MediaGol2,
"Over1": req.params.Over1T,
"Over2": req.params.Over2T,
"Over1Trasferta": req.params.Over1Trasferta,
"Over2Trasferta": req.params.Over2Trasferta,
"GolSegnati": req.params.GolSegnati2,
"GolSegnatiTrasferta": req.params.GolSegnatiTrasferta,
"GolSubiti": req.params.GolSubiti2,
"GolSubitiTrasferta": req.params.GolSubitiTrasferta
,function(err, teams)
if(err)
console.log(err);
res.status(500).send(err);
else
res.status(200).send(teams);
);
);
app.listen(3000, function()
console.log('server is running');
);
在终端中我得到了这个错误: CastError: Cast to number failed for value "undefined" at path "GolSubitiCasa"
CastError: 路径“GolSubitiTrasferta”处值“未定义”的数字转换失败
对于意大利语字段我很抱歉,但这是我电脑上的一个旧数据库,我只用它来学习
【问题讨论】:
req.params.GolSubitiCasa
和 req.params.GolSubitiTrasferta
未定义。在尝试保存到数据库之前尝试使用控制器中的控制台进行调试。
所有 req.params。以未定义的形式到达后端,但在前端,数字是正确的。
【参考方案1】:
其实req.params
代表路由参数。您需要使用req.body
来获取您在查询中提交的数据。
当您像这样从前端拨打电话时:
$http.put('/api/teams/update/' + $scope.teams[i]._id,
params:
// ...
"GolSubitiCasa": GolSubitiCasa
);
您将获得的服务器端:
app.put('/api/teams/update/:_id', function(req, res)
console.log(req.params); // -> _id: the value of $scope.teams[i]._id
console.log(req.body); // ->
// params:
// // ...
// "GolSubitiCasa": GolSubitiCasa
//
//
console.log(req.params.GolSubitiCasa);
// -> undefined
)
由于您的 teamsSchema
将 GolSubitiCasa
定义为数字并且 req.params.GolSubitiCasa
未定义,因此您会收到 CastError(undefined
不是数字)。
要获取您的数据,您需要使用:
app.put('/api/teams/update/:_id', function(req, res)
console.log(req.body.params); // ->
// // ...
// "GolSubitiCasa": GolSubitiCasa
//
console.log(req.body.params.GolSubitiCasa);
// -> the value of GolSubitiCasa
)
另外,我建议您更改对象的名称,因为params
会让人有点困惑。
req.params 的快速文档。
【讨论】:
以上是关于CastError:路径中值“未定义”的数字转换失败的主要内容,如果未能解决你的问题,请参考以下文章
CastError:模型“用户”的路径“_id”处的值“未定义”转换为 ObjectId 失败
mongoose CastError:在路径“apps”处为值“[object Object]”转换为未定义失败
Mongoose CastError:模型“Post”的路径“_id”处的值“未定义”转换为 ObjectId 失败
Mongoose:CastError:在路径“items”处为值“ value:'x'”转换为嵌入失败