我正在尝试将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中无法使用该应用程序?
答案 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”即可。
...就这样。