app.get не является функцией в express.js - PullRequest
0 голосов
/ 04 июля 2018

На самом деле я не могу понять, почему в файле index.js ниже приведен фрагмент кода: app.get не является функцией. Пожалуйста, помогите мне ..

// вот мой файл app.js

const express = require('express');
const app = express();
const helpers = require('./helpers');
const routes = require('./index')

app.use((req, res, next) => {
    app.locals.h = helpers;
    next();
});

app.use('/', routes);

app.set('views',(__dirname));
app.set('view engine', 'pug');

app.listen(3000,()=>console.log('port 3000'));

module.exports = app;

// вот мой файл index.js

const app = require('./app')

app.get('/',(req,res) => {
   res.render('template');
})

module.exports = router;

// helpers.js

exports.title = "NODEjs";

// template.pug

doctype html
html
  head
    title=`${h.title}`
  body
    h1 myHeading #{h.title}

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Добавьте скобки в первой строке:

const express = require('express')();
0 голосов
/ 04 июля 2018

У вас есть циклический цикл зависимостей, и вместо создания бесконечного цикла подсистема require() обнаруживает это и не может загрузить ваш модуль.

В app.js загружается index.js. В index.js вы загружаете app.js. Круговая петля зависимостей.

Существует два отдельных метода, которые можно использовать для решения вашей конкретной проблемы. Похоже, вы используете некоторые из техник, а некоторые - другой, и это создает вашу проблему.

Классический способ определения новых маршрутов в отдельном файле - просто создать этот файл и экспортировать свой собственный маршрутизатор. Затем он назначает маршруты маршрутизатору (не app) и, таким образом, другому файлу вообще не нужен объект app. Поскольку вы показываете module.exports = router, похоже, у вас есть часть этой техники, но только ее часть.

Вот как код будет работать, чтобы сделать это таким образом:

// app.js
const express = require('express');
const app = express();
const helpers = require('./helpers');

app.use((req, res, next) => {
    app.locals.h = helpers;
    next();
});

// hook in routes from the index.js router
app.use('/', require('./index'));

app.set('views',(__dirname));
app.set('view engine', 'pug');

app.listen(3000,()=>console.log('port 3000'));


// index.js
const router = require('express').Router();
router.get('/',(req,res) => {
    res.render('template');
});

module.exports = router;

Вы также можете передать app в index.js при загрузке, а не пытаться импортировать app. Это также решает проблему циклической зависимости.

const express = require('express');
const app = express();
const helpers = require('./helpers');

// pass app here so it can register routes
require('./index')(app);

app.use((req, res, next) => {
    app.locals.h = helpers;
    next();
});

app.use('/', routes);

app.set('views',(__dirname));
app.set('view engine', 'pug');

app.listen(3000,()=>console.log('port 3000'));

Измените index.js, чтобы экспортировать вызываемый вами конструктор модуля и передать app в:

module.exports = function(app) {
    app.get('/',(req,res) => {
        res.render('template');
    })
}
...