简体   繁体   English

Expressjs4路由错误

[英]Expressjs4 Routing Error

I am in the process of learning node and expressjs and have been running into a routing issue that I have been trying to debug. 我正在学习node和expressjs的过程中,一直遇到我一直试图调试的路由问题。 I believe that I am using the right properties and method calls, but for some reason it looks like my issue is either coming from when I create a new object from my blogModel module or when I call app.use("/", routes); 我相信我使用的是正确的属性和方法调用,但是由于某种原因,看来我的问题出在我通过blogModel模块创建新对象时还是在我调用app.use("/", routes); in my server.js file. 在我的server.js文件中。

Error Message: 错误信息:

/Users/user/Desktop/Projects/node/blog/node_modules/express/lib/router/index.js:423
      throw new TypeError(msg);
            ^
TypeError: Router.use() requires callback function but got a [object Undefined]
    at /Users/user/Desktop/Projects/node/blog/node_modules/express/lib/router/index.js:423:13
    at Array.forEach (native)
    at Function.use (/Users/user/Desktop/Projects/node/blog/node_modules/express/lib/router/index.js:419:13)
    at /Users/user/Desktop/Projects/node/blog/node_modules/express/lib/application.js:178:21
    at Array.forEach (native)
    at Function.use (/Users/user/Desktop/Projects/node/blog/node_modules/express/lib/application.js:175:7)
    at Object.<anonymous> (/Users/user/Desktop/Projects/node/blog/server.js:28:5)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
26 Aug 08:18:05 - [nodemon] app crashed - waiting for file changes before starting...

server.js: server.js:

//Load express
var express = require('express');
var app = express();
var router = express.Router(); // get an instance of the router
var bodyParser = require('body-parser');
var mongoose = require('mongoose');
var routes = require('./app/routes.js')(router);
// configure app to use bodyParser()
// get data from a POST method
app.use(bodyParser.urlencoded({ extended: true}));
app.use(bodyParser.json());

var port = process.env.PORT || 8080; // set the port


var blogDB = require('./config/blogDB.js');

var Blogpost = require('./app/models/blogModel');

app.set('view engine', 'ejs'); // set ejs as the view engine

app.use(express.static(__dirname + '/public')); // set the public directory

// use routes.js
app.use('/', routes);

app.listen(port);
console.log('magic is happening on port' + port);

routes.js: routes.js:

module.exports = function(app, router) {

  var express = require('express');
  var router = express.Router();
  var blogDB = require('../config/blogDB.js');

  //index
  router.route('/', function(req, res) {
    var drinks = [
      { name: 'Bloody Mary', drunkness: 3 },
      { name: 'Martini', drunkness: 5 },
      { name: 'Scotch', drunkness: 10 }
    ];

    var tagline = "Lets do this.";

    res.render('pages/index', {
      drinks: drinks,
      tagline: tagline
    });
  });

  //blog
  router.route('/blog')
    .post(function(req, res) {

      var blogpost = new Blogpost(); // create a new instance of a Blogpost model
      blogpost.title = req.body.name; // set the blog title
      blogpost.body = req.body.body; // set the blog content
      blogpost.save(function(err) {
      if (err)
        res.send(err);
        res.json({ message: 'Blog created.' });
      });
    });

  //about
  router.get('/about', function(req, res) {
    res.render('pages/about');
  });
}

You forget to add the first parameter to routes function: 您忘记为路由功能添加第一个参数:

var routes = require('./app/routes.js')(router);

Need to be 需要

var routes = require('./app/routes.js')(app, router);

Have another look at the prototype of the function: 再看一下函数原型:

module.exports = function(app, router)...

First of all as @jonjon mentioned you only have one parameter ( router ) when you should have two parameters ( app , router ) 首先,作为@jonjon提到你只有一个参数( router )时,你应该有两个参数( approuter

var routes = require('./app/routes.js')(app, router);

This reveals another issue though. 但这揭示了另一个问题。 In router.js you are creating a new router but never telling your Express app to use it. router.js您正在创建一个新的路由器,但从未告诉Express应用程序使用它。

module.exports = function(app, router) {

  var express = require('express');
  var router = express.Router();

Remedying this will require a little refactoring. 解决此问题将需要一些重构。

routes.js routes.js

var express = require('express');
var router = express.Router();
var blogDB = require('../config/blogDB.js');

//index
router.route('/')
  .get(function(req, res) {
    /* ... */
  });

router.route('/blog')
  .post(function(req, res) {
    /* ... */
  });

router.get('/about', function(req, res) {
  /* ... */
});

module.exports = router; // This is the important part

Then in server.js you can: 然后在server.js中,您可以:

var routes = require('./routes');
app.use(routes);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM