【问题标题】:CastError: Cast to ObjectId failed for value "favicon.ico" at path "_id" for modelCastError:模型的路径“_id”处的值“favicon.ico”转换为 ObjectId 失败
【发布时间】:2017-08-18 09:27:26
【问题描述】:

我正在学习如何在 youtube 教程的帮助下制作 node api,但是每次运行 nodemon 并转到 localhost 时都会出现此错误。我没有在我的代码的任何部分使用 nay favicon.ico。有人可以帮我吗?

这是我的电影模型的完整代码

var mongoose = require('mongoose');

//movie schema
var moviesSchema = mongoose.Schema({
   Title: {
       type: String,
       required: true
   },
    Genre: {
        type: String,
        required: true
    },
    Release: {
        type: String,
        required: true
    },
    Director: {
        type: String,
        required: true
    },
    Stars: {
        type: String,
        required: true
    },
    Summary: {
        type: String,
        required: true
    }
});

//export the schema
var Movies = module.exports = mongoose.model('Movies',moviesSchema);

//get movies
module.exports.getMovies = function(callback, limit){
    Movies.find(callback).limit(limit);
};

//get movies by id
module.exports.getMovieById = function(id, callback){
    Movies.findById(id, callback);
};

//add a movie
module.exports.addMovie = function(movie, callback){
    Movies.create(movie, callback);
};

//update a movie
module.exports.updateMovie = function(id, movie, options, callback){
    var query = {_id:id};
    var update = {
        Title : movie.Title,
        Genre : movie.Genre,
        Release : movie.Release,
        Director : movie.Director,
        Stars : movie.Stars,
        Summary : movie.Summary


    };
    Movies.findOneAndUpdate(query, update, options, callback);
};

//delete a movie
module.exports.deleteMovie = function(id, callback){
    var query = {_id:id};
    Movies.remove(query, callback);
};

这是我的 index.js

var express = require('express');
var bodyParser = require("body-parser");
var mongoose = require('mongoose');

Movie = require('./models/movies');

var app = express();

app.use(bodyParser.json());

//mongoose connection
mongoose.connect('mongodb://localhost/movielist');
var db = mongoose.connection;

//get all movies json format
app.get('/',function(req,res){
    Movie.getMovies(function(err,movies){
        if(err){
            throw err;
        }
        res.json(movies);
    });
});

//get movie by id
app.get('/:_id',function(req,res){
    Movie.getMovieById(req.params._id, function(err,movie){
        if(err){
            throw err;
        }
        res.json(movie);
    });
});

//post new movies
app.post('/',function(req,res){
    var movies = req.body;
    Movie.addMovie(movies,function(err,movies){
        if(err){
            throw err;
        }
        res.json(movies);
    });
});

//update new movies
app.put('/:_id',function(req,res){
    var id = req.params._id;
    var movies = req.body;
    Movie.updateMovie(id, movies, {}, function(err,movies){
        if(err){
            throw err;
        }
        res.json(movies);
    });
});

//delete an existing movie
app.delete('/:_id',function(req,res){
    var id = req.params._id;
    Movie.deleteMovie(id, function(err,movies){
        if(err){
            throw err;
        }
        res.json(movies);
    });
});

app.listen(8000);
console.log("running on port 8000");

从我在控制台日志中看到的错误可能来自此代码

   //get movies by id
module.exports.getMovieById = function(id, callback){
    Movies.findById(id, callback);
};

并在此代码中的 index.js 中

Movie.getMovieById(req.params._id, function(err,movie){

但我不明白 favicon.ico 失败

【问题讨论】:

    标签: node.js mongodb


    【解决方案1】:
    //get movie by id
    app.get('/:_id',function(req,res){
    Movie.getMovieById(req.params._id, function(err,movie){
        if(err){
            throw err;
        }
        res.json(movie);
    });
    

    获取请求不能有参数。

    您应该改为将其更改为发布请求

    【讨论】:

    • 谢谢。我用谷歌搜索了为什么它不能有参数,发现我应该使用 req.query._id 来代替。
    • Oki,又需要一点帮助。似乎问题返回了,这不是因为获取请求中的参数。似乎它一直在尝试为 _id 获取 favicon.ico,但找不到它或其他东西。当我想获取电影 bij id 时,这会导致我的 api 崩溃
    【解决方案2】:

    我刚刚解决了这个问题很长一段时间,并尝试了多种修复方法(包括将我的 Mongoose 版本降级到 4.7.2 或更低版本,这是在其他地方建议的),但不幸的是,它们都不适合我。也就是说,虽然我无法解释为什么会发生这种情况*,但有一个简单的解决方法对我有用:

    不要向 ~/:var 发出请求。而是在两者之间添加一个额外的层,以便您的请求转到 ~/string/:var

    在您的问题中,您对“/:”有一个 get、一个 put 和一个 delete 请求。更改这三行代码以及任何依赖项,您应该或多或少地好起来。


    *我对为什么会发生这种情况的最佳猜测:某些东西无法将“/”路径识别为空,而是同时匹配“/”和“/:X”。

    【讨论】:

      【解决方案3】:

      您需要在位于根 ('/') 并与您的服务器通信的 HTML 或 EJS 文件头中的网站图标图标图像中添加一个<link> 标签。

      添加以下通用标签即可解决问题:

      <link rel="icon" type="image/svg+xml" href="https://example.com/image.svg">
      

      或者,如果您有自己的 favicon(任何图像文件,例如下面显示的 image.png)文件放在公共文件夹中,那么您可以使用这个:

      <link rel="icon" href="image.png">
      

      问题解释: 默认情况下,您的浏览器会在您每次请求新页面时查找图标文件;某些浏览器在第一次找到此文件后会对其进行缓存。 &lt;link rel="icon" href="LOCATION"&gt; 将浏览器指向图标文件的位置,按照惯例称为 Favicon.ico。如果 href 是外部 URL,它将从该 URL 获取图标。如果 href 是一个路径(例如“Favicon.ico”),那么它将在您的公用文件夹中查找,如果它不存在于公用文件夹中,那么它将被称为 /Favicon.ico 上的 GET 路由。这会触发您的代码将不需要的条目添加到数据库中。

      【讨论】:

        【解决方案4】:

        我有类似的问题,它似乎是浏览器的问题。当你访问你的本地主机时,它会向 http://localhost:PORT/favicon.ico 发送一个请求,该请求转到 app.get('/:_id') 并设置为 _id="favicon.ico"。所以你应该这样做:

        app.get('/:_id',function(req,res) {
            // if req.params._id is favicon.ico then response immediately
            if (req.params._id === "favicon.ico") {
                return res.status(404)
            }
            // your code
            Movie.getMovieById(req.params._id, function(err,movie){
                if(err){
                    throw err;
            }
            res.json(movie);
        });
        

        【讨论】:

          猜你喜欢
          • 2014-06-20
          • 2020-11-19
          • 2021-07-04
          • 2016-11-11
          • 2017-03-26
          • 2017-05-26
          • 2020-05-20
          • 2020-12-10
          • 2021-02-21
          相关资源
          最近更新 更多