Console.log (err) сбивает мой сайт - PullRequest
0 голосов
/ 03 июля 2018

В настоящее время я учусь на веб-разработке с Node. Недавно я просматривал маршруты RESTful. Я делал сайт для этого. Я настраивал маршрут для показа определенного блога "/ blogs /: id", который позволяет вам видеть все содержимое блога. Вот маршрут:

app.get("/blogs/:id", function(req, res){
    blog.findById(req.params.id, function(err, blog){
        if(err){
            console.log(err)
        } else{
            res.render("show", {body: blog});
        }
    })
})

Когда я получаю доступ к маршруту через браузер, он загружается вечно, и в терминале появляется следующая ошибка:

{ CastError: Cast to ObjectId failed for value "app.css" at path "_id" for model "blog"
    at MongooseError.CastError (/home/ubuntu/workspace/RESTful/node_modules/mongoose/lib/error/cast.js:29:11)
    at ObjectId.cast (/home/ubuntu/workspace/RESTful/node_modules/mongoose/lib/schema/objectid.js:158:13)
    at ObjectId.SchemaType.applySetters (/home/ubuntu/workspace/RESTful/node_modules/mongoose/lib/schematype.js:724:12)
    at ObjectId.SchemaType._castForQuery (/home/ubuntu/workspace/RESTful/node_modules/mongoose/lib/schematype.js:1113:15)
    at ObjectId.SchemaType.castForQuery (/home/ubuntu/workspace/RESTful/node_modules/mongoose/lib/schematype.js:1103:15)
    at ObjectId.SchemaType.castForQueryWrapper (/home/ubuntu/workspace/RESTful/node_modules/mongoose/lib/schematype.js:1082:15)
    at cast (/home/ubuntu/workspace/RESTful/node_modules/mongoose/lib/cast.js:303:32)
    at Query.cast (/home/ubuntu/workspace/RESTful/node_modules/mongoose/lib/query.js:3355:12)
    at Query._castConditions (/home/ubuntu/workspace/RESTful/node_modules/mongoose/lib/query.js:1327:10)
    at Query._findOne (/home/ubuntu/workspace/RESTful/node_modules/mongoose/lib/query.js:1552:8)
    at process.nextTick (/home/ubuntu/workspace/RESTful/node_modules/kareem/index.js:333:33)
    at _combinedTickCallback (internal/process/next_tick.js:73:7)
    at process._tickCallback (internal/process/next_tick.js:104:9)
  message: 'Cast to ObjectId failed for value "app.css" at path "_id" for model "blog"',
  name: 'CastError',
  stringValue: '"app.css"',
  kind: 'ObjectId',
  value: 'app.css',
  path: '_id',
  reason: undefined,
  model: 
   { [Function: model]
     hooks: Kareem { _pres: [Object], _posts: [Object] },
     base: 
      Mongoose {
        connections: [Object],
        models: [Object],
        modelSchemas: [Object],
        options: [Object],
        _pluralize: [Function: pluralize],
        plugins: [Object] },
     modelName: 'blog',
     model: [Function: model],
     db: 
      NativeConnection {
        base: [Object],
        collections: [Object],
        models: [Object],
        config: [Object],
        replica: false,
        options: null,
        otherDbs: [],
        relatedDbs: {},
        states: [Object],
        _readyState: 1,
        _closeCalled: false,
        _hasOpened: true,
        _listening: false,
        _connectionOptions: [Object],
        client: [Object],
        name: 'restful_routing_revision',
        '$initialConnection': [Object],
        db: [Object] },
     discriminators: undefined,
     '$appliedMethods': true,
     '$appliedHooks': true,
     schema: 
      Schema {
        obj: [Object],
        paths: [Object],
        aliases: {},
        subpaths: {},
        virtuals: [Object],
        singleNestedPaths: {},
        nested: {},
        inherits: {},
        callQueue: [],
        _indexes: [],
        methods: {},
        methodOptions: {},
        statics: {},
        tree: [Object],
        query: {},
        childSchemas: [],
        plugins: [Object],
        s: [Object],
        _userProvidedOptions: {},
        options: [Object],
        '$globalPluginsApplied': true,
        _requiredpaths: [] },
     collection: 
      NativeCollection {
        collection: [Object],
        opts: [Object],
        name: 'blogs',
        collectionName: 'blogs',
        conn: [Object],
        queue: [],
        buffer: false,
        emitter: [Object] },
     Query: { [Function] base: [Object] },
     '$__insertMany': [Function],
     '$init': Promise { [Object], catch: [Function] } } }

Но по какой-то причине, когда я изменяю функцию обратного вызова на следующее:

app.get("/blogs/:id", function(req, res){
        blog.findById(req.params.id, function(err, blog){
            if(err){
                res.redirect("/")
            } else{
                res.render("show", {body: blog});
            }
        })
    })

Сайт работает отлично. Я также попытался удалить заголовок из show.ejs (файла, отображаемого при доступе к маршруту), сохраняя console.log(err), и это также решило проблему. Я попытался удалить заголовок, потому что заголовок содержит тег, который связывает файл app.css, который, как я видел, упоминается в сообщении об ошибке. Я хотел бы знать, что не так в console.log(err) с файлом CSS. постскриптум Я использую Expres для маршрутов и мангуста для доступа к базе данных MongoDB. «блог» - это массив блогов. Если вы хотите взглянуть на мой файл show.ejs, вот он:

<% include partials/header %>

<h1><%= body.title%></h1>
<img src="<%=body.image%>">
<p><%=body.body%></p>
<div><%=body.created%></div>

<% include partials/footer %>

И если вы хотите взглянуть на файл app.css, вот он:

img{
    max-width: 600px;
    width: 600px;
}

И если вы хотите взглянуть на файл header.ejs, то вот он: si:

<!DOCTYPE html>
<html>
    <head>
        <title>Blogs Website</title>
        <link rel="stylesheet" type="text/css" href="app.css">
    </head>
    <body>

Вот полный файл app.js (файл, содержащий маршруты):

var express = require("express"),
    app = express(),
    mongo = require("mongoose"),
    bodyParser = require("body-parser"),
    expressSanitizer = require("express-sanitizer"),
    methodOverride = require("method-override");

mongo.connect("mongodb://localhost/restful_routing_revision");
app.use(bodyParser.urlencoded({extended: true}));
app.use(expressSanitizer());
app.set("view engine", "ejs");
app.use(express.static("public"));
app.use(methodOverride('_method'));

var blogSchema = new mongo.Schema({
    title: String,
    body: String,
    image: String,
    created: {type: Date, default: Date.now} 
});

var blog = mongo.model("blog", blogSchema);


app.get("/", function(req, res){
    res.render("landing");
});

app.get("/blogs", function(req, res){
    blog.find({}, function(err, body){
        if(err){
            console.log(err)
        }else{
            res.render("index", {blogs: body})
        }
    })
})

app.get("/dogs/new", function(req, res){
    res.render("new");
})

app.post("/dogs", function(req, res){
    var blogBody = req.body.blog;
    blog.create(blogBody, function(err, body){
        if(err){
            console.log(err)
        }else{
            res.redirect("/blogs")
        }
    })
})

app.get("/blogs/:id", function(req, res){
    blog.findById(req.params.id, function(err, blog){
        if(err){
            // res.redirect("/")
            console.log(err)
        } else{
            res.render("show", {body: blog});
        }
    })
})

// blog.findById(req.params.id, function(err, blog){
//       if(err){
//           res.redirect("/");
//       } else {
//           res.render("show", {body: blog});
//       }
//   });
// });

app.listen(process.env.PORT, process.env.IP, function(){
    console.log("The Server has Started!!!!");
})

Сверху много пакетов npm, которые я планирую использовать позже. И я знаю, что схема блога не очень хорошо отформатирована. Я также попытался сделать console.log(err) и res.redirect("/") одновременно, я прихожу на страницу показа, но все равно получаю ту же ошибку.

1 Ответ

0 голосов
/ 03 июля 2018

Что касается CastError, я не знаю, что происходит в базовом коде ejs, который заставляет его пытаться выполнить запрос Mongo с именем файла css, но в этом посте объясняется, как исправить синтаксис (прочитайте комментарии к ответу). об использовании относительного пути для имени css):

Ошибка NodeJS при отображении страницы: сбой приведения к ObjectId для значения "styles.css" по пути "_id"

Я думаю, что это избавит от ошибки в вашей конечной точке.

За заголовок вопроса о сбое сервера и замечание, что:

Когда я получаю доступ к маршруту с помощью браузера, он загружается навсегда

потому, что конечная точка никогда не выдает ответ клиенту, когда вы получаете сообщение об ошибке. Все конечные точки должны так или иначе отвечать клиенту. В вашем случае документированная 1 рекомендация заключается в следующем: вызвать функцию промежуточного программного обеспечения Express:

blog.findById(req.params.id, function(err, blog){
    if(err){
        console.log(err);
        next(err);
    } else{

Следующая функция вернет результат ошибки клиентскому браузеру. Вам нужно использовать next, потому что функция .find вашей модели Mongoose является асинхронной, а функция Expresses next предназначена для правильного решения этой проблемы.

Отдельно от того, что вы опубликовали, ваш сервер Express, скорее всего, не выйдет из строя. Он регистрирует сообщение консоли с ошибкой, как вы и просили, и затем продолжает ждать новых запросов (запись ошибки на консоль - это нормально!). В случае сбоя вы, вероятно, получите в браузере страницу с ошибкой 500, и процесс узла прекратится. Я упоминаю об этом в надежде помочь в дальнейшей отладке. Я думаю, что если бы вы искали вопрос о том, что конечная точка не возвращается, вы, вероятно, нашли бы существующий ответ о конечных точках, которые никогда не возвращаются клиенту (это распространенная проблема, с которой нужно столкнуться при начале работы). Надеюсь, это поможет!

Документ экспресс-обработки ошибок

...