首页 > 解决方案 > 在 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 调用?

标签: javascriptnode.jsexpressnext.js

解决方案


这是这个著名问题的一个特例。同步代码可以转换为异步代码,反之则不行。

这个类似的答案所示,如果需要,应将 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旨在为这个配方提供语法糖。


推荐阅读