Ошибка в экспресс-приложении при переходе с .use (req, res) на использование файла rout.js - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть сайт в экспрессе, и я пытаюсь преобразовать его, чтобы использовать файл rout.js для очистки.Я получаю TypeError, объясненную ниже.Я прочитал это и это , но я все еще не могу понять это.В настоящее время сайт работает со следующими строками:

const server = express()
    .set('view engine', 'ejs') // set up ejs for templating
    .use(flash()) // use connect-flash for flash messages stored in session
  .use((req, res) => res.render('../views/pages/indextimewithall.ejs', {stockSearched :"X",
                     activeStocks: [],
                    addingError:false}) )
  .listen(port);


const wss = new SocketServer({ server });

wss.on('connection', (ws) => {
  console.log('Client connected');
  ws.on('close', () => console.log('Client disconnected'));
});

setInterval(() => {
  wss.clients.forEach((client) => {
    client.send(new Date().toTimeString());
  });
}, 1000);

Но когда я изменяю его на это:

const server = express()

.set('view engine', 'ejs') // set up ejs for templating
        .use(flash()) // use connect-flash for flash messages stored in session
      .listen(port);
    require('./app/routes.js')(server); 

    const wss = new SocketServer({ server });

    wss.on('connection', (ws) => {
      console.log('Client connected');
      ws.on('close', () => console.log('Client disconnected'));
    });

    setInterval(() => {
      wss.clients.forEach((client) => {
        client.send(new Date().toTimeString());
      });
    }, 1000);

.. Я получаю TypeError: app.get не является функцией

Вот содержимое файла rout.js:

// app/routes.js
module.exports = function(app) {
    app.get('/', function(req, res) {
        var myStocks = require('./models/myStock'); 
        var showStocks = function(err, data){
            res.render('pages/indextimewithall.ejs', {
                     stockSearched :"X",
                    activeStocks: [],
                    addingError:false
                });
        }
        myStocks.find({isActive:true}).exec(showStocks);
    });
};

Спасибо за любые предложения.

1 Ответ

0 голосов
/ 25 апреля 2018

У вас все в порядке (хотя удобочитаемость и удобство обслуживания - большая проблема ...).Вот большой уловка для вас: метод

app.listen не является цепным, но серии app.use или app.METHOD.Это означает, что этот метод не возвращает себя в конце.Таким образом, вы получите app.get не определено, потому что ваша переменная server не является экспресс-экземпляром.

Что вам нужно сделать, это разорвать цепочку и определить следующим образом:

const app = express();
app.set('view engine', 'ejs');     // set up ejs for templating
app.use(flash());                  // use connect-flash for flash messages stored in session
require('./app/routes.js')(app);   // not recommended to clean up like this way though
app.listen(port);


const wss = new SocketServer({ server: app });
wss.on('connection', (ws) => {
  console.log('Client connected');
  ws.on('close', () => console.log('Client disconnected'));
});


setInterval(() => {
  wss.clients.forEach((client) => {
    client.send(new Date().toTimeString());
  });
}, 1000);

Обратите внимание, что выше я переименовал вашу переменную server в app.Просто чтобы следовать соглашению.

Вы можете узнать, является ли метод цепным, выполнив что-то вроде этого:

const app = express();
console.log(app === app.use((req, res, next) => next)));  // true
console.log(app === app.listen(3000));  // false
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...