javascript - 在 module.exports 之前等待异步函数
问题描述
我有一个 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 调用?
解决方案
这是这个著名问题的一个特例。同步代码可以转换为异步代码,反之则不行。
如这个类似的答案所示,如果需要,应将 Promise 用于应用程序入口点:
module.exports = (async () => {
const globalSettings = await getEntries({
content_type: 'globalSettings',
});
return routes
.add('caseStudies', `/${globalSettings.fields.caseStudiesSlug}`, 'caseStudies')
.add('caseStudy', `/${globalSettings.fields.caseStudiesSlug]}/:slug`, 'caseStudy')
.add('home', `/`, 'index')
.add('page', `/:slug*`, 'page'));
})();
该模块还导出了一个 Promise,因此需要将其链接到依赖它的模块中。
有一个顶层提议,await
旨在为这个配方提供语法糖。
推荐阅读
- node.js - 带有 pem 证书的 axios 请求
- .net - xpath 按元素名称选择直接 XML 子项
- java - 循环遍历 ArrayList 的所有可能组合
- javascript - 计时器不会触发“onclick”。在页面加载时触发
- python - 需要 Discord Bot 删除以前的消息
- apple-login - Macbook pro 卸载 SAASPass 后不显示登录屏幕
- wordpress - Docker-compose 在 debian 虚拟机上。想要以某种方式启用 wpmultisite 以允许在没有插件的情况下创建多语言站点
- c++ - 如何在 CLion 中创建新的 C++ 文件?
- python - 启动器中的 Pip 致命错误:使用“”时无法创建进程
- flutter - 没有 FCM 的 Flutters Push Notifications 还是必须的?