NodeJs - TypeError: не удается прочитать свойство url со значением null, но приложение работает нормально - PullRequest
0 голосов
/ 03 августа 2020

ОБНОВЛЕНИЕ: я проверяю наличие /: slug, даже если я go на другой маршрут, я думаю, что это вызывает проблему.

Я пытаюсь создать URL-адрес Сокращатель с Nodejs, Expressjs, MongoDB и E JS.

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

Мои маршруты:

const express = require("express");
const URLs = require("../models/urls");
const { findById, find } = require("../models/urls");
const router = express.Router();

router.get("/", (req, res) => {
  res.render("index", { shortUrl: new URLs() });
});

router.post("/redirect", (req, res) => {
  let url = req.body.url;
  let slug = req.body.slug;
  let shortenUrl = new URLs({
    url: url,
    slug: slug,
  });
  shortenUrl.save();
  res.render("shortenUrl", { shortenUrl });
});

router.get("/about", (req, res) => {
  res.render("about");
});

router.get("/contact", (req, res) => {
  res.render("contact");
});

router.get("/all", async (req, res) => {
  try {
    var shortUrls = await URLs.find({});
    res.render("all", { shortUrls });
  } catch (error) {
    console.log(error);
  }
});

//:TODO
router.get("/:slug", async (req, res) => {
  var shortUrl = await URLs.findOne({ slug: req.params.slug }).exec();
  try {
    console.log(shortUrl);
    var urls = await shortUrl.url;
    if (urls.includes("http", 0)) {
      return res.redirect(urls);
    } else {
      return res.redirect(`http://${urls}`);
    }
  } catch (error) {
    console.log(error);
  }
});

module.exports = router;

Я не получал эту ошибку, пока не сделал API для приложения (в отдельном файле маршрутов). Также на моем сервере я использую:

app.use(bodyParser.urlencoded({ extended: false }));

, а использование:

app.use(express.json());

тоже не помогает.

Любая помощь приветствуется, спасибо c:

1 Ответ

0 голосов
/ 04 августа 2020

Я добавил оператор if к маршруту, и это решило проблему благодаря @Pukka c:

router.get("/:slug", async (req, res) => {
  var shortUrl = await URLs.findOne({ slug: req.params.slug }).exec();
  if (shortUrl) {
    try {
      console.log(shortUrl);
      var urls = await shortUrl.url;
      if (urls.includes("http", 0)) {
        return res.redirect(urls);
      } else {
        return res.redirect(`http://${urls}`);
      }
    } catch (error) {
      console.log(error);
    }
  }
...