app.get () не может найти и показать нужную страницу шаблона (нефрита) - PullRequest
0 голосов
/ 18 февраля 2019

Я изучаю очень простой серверный JS с использованием express, jade, node.JS.

На первой странице (localhost / topic) есть список.И список данных из MySQL.(Поля MySQL: id, title, description и author). Также имеется ссылка для открытия формы (форма находится в файле add.jade), которая может добавить элемент в список.

Моя проблемав том, что если я нажал на ссылку, на странице все еще отображается view.jade.Но адрес меняется на «localhost / topic / add».

Я проверил файл «app.js», чтобы увидеть, правильно ли установлен app.get ().Но я не нашел ни одного.На самом деле, шаблон сначала был написан как нефрит.Но я попытался преобразовать нефрит в мопса.После этой ошибки я положил их обратно в нефрит.Это проблема?

Спасибо.

var express = require("express");
var app = express();

app.set("views", "./views_mysql");
app.set("view engine", "jade");

app.listen(3000, function() {
  console.log("Connected, 3000 port!");
});

app.locals.pretty = true;

var mysql = require("mysql");
var conn = mysql.createConnection({
  host: "localhost",
  user: "jimin",
  password: "****",
  database: "o2"
});
conn.connect();

app.get(["/topic", "/topic/:id"], function(req, res) {
  var sql = "SELECT id, title FROM topic";
  conn.query(sql, function(err, topics, fields) {
    var id = req.params.id;
    if (id) {
      var sql = "SELECT * FROM topic WHERE id=?";
      conn.query(sql, [id], function(err, id_topics, fields) {
        if (err) {
          console.log(err);
          res.status(500).send("Internal Server Error");
        } else {
          res.render("view", { topics: topics, topic: id_topics[0] });
        }
      });
    } else {
      res.render("view", { topics: topics });
    }
  });
});

app.get("/topic/add", function(req, res) {
  var sql = "SELECT id, title FROM topic";
  conn.query(sql, function(err, topics, fields) {
    if (err) {
      console.log(err);
      res.status(500).send("Internal Server Error");
    } else {
      res.render("add", { topics: topics });
    }
  });
});

<!-- begin snippet: js hide: false console: true babel: false -->
// add.jade

doctype html
html
  head
    meta(charset='utf-8')
  body
    h1
      a(href='/topic') Server Side JavaScript
    ul
      each topic in topics
        li
          a(href='/topic/' + topic.id)= topic.title
    article
      form(action='/topic/add' method='post')
        p
          input(type='text' name='title' placeholder='title')
        p
          textarea(name='description' placeholder='description')
        p
          input(type='text' name='author' placeholder='author')
        p
          input(type='submit')

//view.jade

doctype html
html
  head
    meta(charset='utf-8')
  body
    h1
      a(href='/topic') Server Side JavaScript
    ul
      each topic in topics
        li
          a(href='/topic/' + topic.id)= topic.title
    article
      if topic
        h2= topic.title
        = topic.description
        div= 'by ' + topic.author
      else
        h2 Welcome
        | This is Server Side JS Tutorial
    div
      a(href='/topic/add') add Topic
app.get("/topic/add", function(req, res) {
    var sql = "SELECT id, title FROM topic";
    conn.query(sql, function(err, topics, fields) {
        if (err) {
            console.log(err);
            res.status(500).send("Internal Server Error");
        } else {
            res.render("add", { topics: topics });
        }
    });
});

1 Ответ

0 голосов
/ 18 февраля 2019

Это проблема с расположением маршрутов.

TLDR

Переместить определение маршрута на app.get выше ранее объявленного маршрута.

Пояснение

Определения маршрутов в экспрессе основаны на подходе сверху вниз.Итак, во время выполнения ваши маршруты отображаются следующим образом:

  • /topic
  • /topic/:id
  • topic/add

Когда вы посещаете страницу /topic/add, вы ожидаете, что она будет соответствовать третьему в списке, но Express на самом деле сопоставит его со вторым в списке ... На самом деле она будет соответствовать всем , если вы введетечто-нибудь после /topic.

...