Добавление нового маршрута в node express - программирование
Подтвердить что ты не робот

Добавление нового маршрута в node express

Я пытаюсь добавить новый маршрут в мое экспресс-приложение, но при попытке запустить сервер я все время получаю ошибку. Ошибка

C:\development\node\express_app\node_modules\express\lib\router\index.js:252
    throw new Error(msg);
          ^
Error: .get() requires callback functions but got a [object Undefined]

вот мои файлы, я новичок в node, поэтому дайте мне знать, если я оставил важный файл

маршруты/furniture.js

exports.furniture = function(req, res){
   res.render('furniture', { title: '4\267pli' });
};

маршруты/index.js

/*
 * GET home page.
 */

exports.index = function(req, res){
  res.render('index', { title: '4\267pli' });
};

просмотров/furniture.ejs

<!DOCTYPE html>
<html>
<head>
    <title>4&middot;pli -- architecture</title>
    <link rel='stylesheet' href='/stylesheets/style.css'/>
    <link href='http://fonts.googleapis.com/css?family=Didact+Gothic' rel='stylesheet' type='text/css'>
</head>
<body>
<div class="wrapper">
    <h1 class="logo"><%= title %></h1>
</div>
</body>
</html>

app.js

/**
 * Module dependencies.
 */

var express = require('express')
  , routes = require('./routes')
  , user = require('./routes/user')
  , furniture = require('./routes/furniture')
  , http = require('http')
  , path = require('path');

var app = express();

// all environments
app.set('port', process.env.PORT || 3000);
app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(app.router);
  app.use(require('stylus').middleware(__dirname + '/public'));
app.use(express.static(path.join(__dirname, 'public')));

// development only
if ('development' == app.get('env')) {
  app.use(express.errorHandler());
}

app.get('/', routes.index);
app.get('/users', user.list);
app.get('/furniture', routes.furniture);

http.createServer(app).listen(app.get('port'), function(){
  console.log('Express server listening on port ' + app.get('port'));
});
4b9b3361

Ответ 1

Проблема:

 routes = require('./routes'),
 user = require('./routes/user'),
 furniture = require('./routes/furniture'),

Эти 3 устанавливают ваши папки маршрутов, а не конкретный файл, express будет искать index.js(не найден, затем → ошибка)

Внутри этих папок вы должны поместить index.js с помощью:

exports.xxxx =  function(req, res){
    res.render('xx', { foo: foo});
};

Затем ваша структура папок проекта должна выглядеть так:

routes/
  ├── index.js
  │
  ├── user/
  │     └── index.js (with a exports.user inside)
  │   
  └── fourniture/
        └── index.js (with a exports.furniture inside)

Вы можете добавить несколько функций экспорта к следующему маршруту:

app.js

// a folder called routes with the index.js file inside
routes = require('./routes')

.
.
.

app.get('/', routes.main_function);  
app.get('/sec_route', routes.sec_function);
app.post('/other_route', routes.other_function);

/routes/index.js

exports.main_function =  function(req, res){
    res.render('template1', { foo: foo });
};

exports.sec_function =  function(req, res){
    res.render('template2', { bar: bar });
};

exports.other_function =  function(req, res){
    res.render('template1', { baz: baz });
};

Ответ 2

Если ваш сайт настолько велик, я предпочитаю делать что-то вроде:

routes/furniture.js:

module.exports = function(app)
{
    app.get("/furniture/", function(req, res) {
        res.render('furniture', { title: '4\267plieee' });
    });
}

И затем в app.js:

require("./routes/furniture")(app);

Это в основном то же самое, но app.js будет более чистым.

Ответ 3

Хотя это несколько старо, хотя и делится тем, как я это делаю. Вот еще один подход, который делает код более чистым и легким для добавления маршрутов.

app.js

const app = express();
const routes = require('./routes');
app.use('/api', routes); //Main entry point

/routes/index.js

const router = require('express').Router();
const user = require('./user');
const admin = require('./admin'); 

//This is a simple route
router.get('/health-check', (req, res) =>
    res.send('OK')
);

router.route('/users')
      .post(validate, user.createUser);

router.route('/users/:userId')
      .get(validateUser, user.getUser)  
      .patch(validateUser, user.updateUser)
      .delete(validateUser, user.deleteUser);

router.route('/admins/:adminId/dashboard')
      .get(validateAdmin,admin.getDashboard);

module.exports = router;

'validateUser' и 'validateAdmin' - это пользовательские средние товары, которые будут использоваться для проверки параметров запроса или для предварительной обработки перед запросом до получения фактического обработчика запросов. Это необязательно, и вы можете иметь несколько промежуточных программ (разделенных запятыми).

/routes/user.js

module.exports = {
  createUser:function(req,res,next){

  },
  updateUser:function(req,res,next){

  },
  deleteUser:function(req,res,next){

  }
}

/routes/admin.js

module.exports = {
  getDashboard:function(req,res,next){

  }
}