繁体   English   中英

从.use(req,res)更改为使用route.js文件时Express应用程序出错

[英]Error in express app when changing from .use(req,res) to using a routes.js file

我有一个快递网站,正在尝试将其转换为使用route.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不是一个函数

以下是route.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);
    });
};

感谢您的任何建议。

您的清理工作就很好了(尽管可读性和可维护性是一个大问题……)。 这是给您的一个大陷阱:

app.listen方法不可链接,但app.useapp.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

暂无
暂无

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

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