【发布时间】:2019-07-13 06:50:54
【问题描述】:
我有一个 NextJS 应用程序,并且正在使用 next-routes 来处理所有路由。
我的路由模块目前如下所示:
const routes = require('next-routes')();
const { getEntries } = require('../data/contentful');
module.exports = async () => {
const globalSettings = await getEntries({
content_type: 'globalSettings',
});
routes
.add('caseStudies', `/${globalSettings.fields.caseStudiesSlug}`, 'caseStudies')
.add('caseStudy', `/${globalSettings.fields.caseStudiesSlug]}/:slug`, 'caseStudy')
.add('home', `/`, 'index')
.add('page', `/:slug*`, 'page'));
return routes;
};
我可以让它在服务器端工作,但要在客户端使用下一个路由,我需要这个模块立即返回路由对象而不是异步函数。例如
const routes = require('next-routes')();
const { getEntries } = require('../data/contentful');
// Do this first, then module.exports
const globalSettings = await getEntries({
content_type: 'globalSettings',
});
module.exports = routes
.add('caseStudies', `/${globalSettings.fields.caseStudiesSlug}`, 'caseStudies')
.add('caseStudy', `/${globalSettings.fields.caseStudiesSlug]}/:slug`, 'caseStudy')
.add('home', `/`, 'index')
.add('page', `/:slug*`, 'page'));
这不起作用,因为await 必须在异步函数中。如何在执行路由对象的 module.exports 之前完成异步 API 调用?
【问题讨论】:
-
我不确定你是否可以,因为
require是同步的,它不能等待 API 调用结束来导入你的模块。顺便说一句,假设您的服务器在十几秒内回答,您希望它做什么?如果它可以等待您的 api 调用结束,它可能会冻结您的服务器,直到它完成。 -
为什么又需要同步?
-
@KevinB 因为可以在客户端导入下一个路由对象并像这样解构
import { Link } from '../routes'; -
等等...所以你想要同步的唯一原因是你可以解构它? imo有点傻。
-
@KevinB 这就是 next-routes 包的工作方式。它是 NextJS 的一个受欢迎的补充,而不是我可以控制的东西。
标签: javascript node.js express next.js