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.GolSubitiCasareq.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
 )

由于您的 teamsSchemaGolSubitiCasa 定义为数字并且 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'”转换为嵌入失败

CastError:路径“_id”处的值“”转换为 ObjectId 失败

CastError:对于猫鼬中模型的路径“_id”处的值“findByName”,转换为 ObjectId 失败