将Express Router与Next.js结合使用

时间:2018-07-24 02:07:09

标签: express next.js

我正在尝试将Express Router与Next.js结合使用,将其repository (connection) wrapper作为样板。唯一的区别是,我试图按如下方式在route / router.js上外部定义路由:

server.js中的代码:

const express = require('express')
const next = require('next')

const port = parseInt(process.env.PORT, 10) || 3000
const dev = process.env.NODE_ENV !== 'production'
const app = next({ dev })
const handle = app.getRequestHandler()
const routes = require('./routes/router')

app.prepare()
  .then(() => {
    const server = express()

    server.use('/', routes)

    server.get('*', (req, res) => {
      return handle(req, res)
    })

    server.listen(port, (err) => {
      if (err) throw err
      console.log(`> Ready on http://localhost:${port}`)
    })
  })

module.exports = app;

routes / router.js中的代码:

const express = require('express'),
app = require('../server.js'),
router = express.Router();

router.get('/a', (req, res) => {
  return app.render(req, res, '/b', req.query)
})

router.get('/b', (req, res) => {
  return app.render(req, res, '/a', req.query)
})

router.get('/posts/:id', (req, res) => {
  return app.render(req, res, '/posts', { id: req.params.id })
})

module.exports = router;

在这一点上,即使当我从server.js导入“ app”时,router.js中也无法使用该应用。

我的逻辑不正确吗? 如果不是,那为什么在router.js中无法使用该应用程序?

2 个答案:

答案 0 :(得分:1)

您还可以尝试使用next-routes,我将其用于所有Next项目:

// server.js
const { createServer } = require('http');
const next = require('next');
const routes = require('./routes');

const port = parseInt(process.env.PORT, 10) || 3000;
const dev = process.env.NODE_ENV !== 'production';
const app = next({ dev });
const handler = routes.getRequestHandler(app);

app.prepare().then(() => {
    createServer(handler).listen(port, err => {
        if (err) {
            throw err;
        }
        console.log(`> Ready on http://localhost:${port}`);
    });
});

然后,您可以在routes.js文件中配置路由,而无需访问该应用程序:

// routes.js

const nextRoutes = require('next-routes');
const routes = (module.exports = nextRoutes());

routes
    .add('landing', '/')
    .add('blog', '/blog', 'blog')
    .add('blog-post', '/blog/:postId', 'blog')

答案 1 :(得分:0)

就解决了。这个问题被称为循环依赖关系,应该不惜一切代价避免……除非您使用的模式(例如我所使用的样板,我想...)需要它。

要解决此问题,只需从文件“ A”中导出文件“ B”使用的依赖项,然后在文件“ A”上需要文件“ B”即可。

...就这样。