CastError:对于模型,路径为“_id”的值为“favicon.ico”时,对于ObjectId的转换失败

时间:2017-03-25 12:44:02

标签: node.js mongodb

我正在学习如何在youtube教程的帮助下创建节点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失败

3 个答案:

答案 0 :(得分:1)

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

  

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

在您的问题中,您有" /:"的get,put和delete请求。改变这三行代码和任何依赖关系,你应该或多或少地去做。

*我最好猜测为什么会发生这种情况:某些事情未能识别" /"路径为空,而是匹配" /"和" /:X"同时进行。

答案 1 :(得分:0)

//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);
});

获取请求无法使用params。

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

答案 2 :(得分:0)

您需要在根目录(<link>处的HTML或EJS文件头中的网站图标图标图像上添加'/'标签,并与服务器通信。

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

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

或者如果您将自己的收藏夹图标(任何图像文件,例如下面显示的image.png)放置在公用文件夹中,则可以使用此文件:

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

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