快递:我该怎么处理? (关于`路线`)

时间:2018-06-17 14:32:59

标签: node.js express

我是node.jsexpress的初学者。

在我的示例项目中,首先,我做了一个快速项目。 我想添加一个名为/product的页面。

所以,我采取了这些步骤。

  1. product.jade文件夹中添加views文件。
  2. product.js文件夹中添加routes文件。
  3. 修改app.js
  4. product.jade就是这样。

    extends layout
    
    block content
        h1 #{title}
        p Product Info.
    

    product.js就是这样。

    var express = require('express');
    var router = express.Router();
    
    /* GET product info. */
    router.get('/product', function(req, res, next) {
      res.render('product', { title: 'Express' });
    });
    
    module.exports = router;
    

    最后,我修改了app.js。我添加了两行。

    一个是var productRouter = require('./routes/product');

    另一个是app.use('/product', productRouter);

    我期待它有效。

    但是当我进入localhost:3000/product时,我只能看到404, Not Found

    请帮忙。我错过了什么?

    ---编辑---

    app.js

    var createError = require('http-errors');
    var express = require('express');
    var path = require('path');
    var cookieParser = require('cookie-parser');
    var logger = require('morgan');
    
    var indexRouter = require('./routes/index');
    var usersRouter = require('./routes/users');
    var productRouter = require('./routes/product');
    
    var app = express();
    
    // view engine setup
    app.set('views', path.join(__dirname, 'views'));
    app.set('view engine', 'jade');
    
    app.use(logger('dev'));
    app.use(express.json());
    app.use(express.urlencoded({ extended: false }));
    app.use(cookieParser());
    app.use(express.static(path.join(__dirname, 'public')));
    
    app.use('/', indexRouter);
    app.use('/users', usersRouter);
    app.use('/product', productRouter);
    
    // catch 404 and forward to error handler
    app.use(function(req, res, next) {
      next(createError(404));
    });
    
    // error handler
    app.use(function(err, req, res, next) {
      // set locals, only providing error in development
      res.locals.message = err.message;
      res.locals.error = req.app.get('env') === 'development' ? err : {};
    
      // render the error page
      res.status(err.status || 500);
      res.render('error');
    });
    
    module.exports = app;
    

1 个答案:

答案 0 :(得分:1)

您为/product/product创建了一条路由,因为您的中间件使用此行指定了/product

app.use('/product', productRouter);

然后,除了此行之外,您的路线再次指定/product

router.get('/product', function(req, res, next) {...}

/product/product创建路线。

有几种方法可以解决这个问题。如果您的意图是productRouter处理以/product开头的所有路由,请将app.use()保持不变并从此处更改:

router.get('/product', function(req, res, next) {...}

到此:

router.get('/', function(req, res, next) {...}

如果您不打算使用以/product开头的多个路由并且只需要定义一个/product路由处理程序,那么您不需要创建一个完整的单独路由器那。你可以改为从product.js导出路由处理程序(而不是导出路由器)然后只使用:

app.get('/product', require('./routes/product'));

这样只会在product.js中放置一个路由处理程序,并避免仅为一条路由创建路由器。