javascript - 在 Express 中的 app.listen 之前等待异步函数完成

标签 javascript node.js express asynchronous cors

我试图从数据库中获取 CORS 的白名单,但显然在我可以从数据库中获取值之前先开始监听端口并设置 CORS。

这是我的代码:

require('dotenv').config()
import jwt from 'jsonwebtoken'
import bcrypt from 'bcryptjs'

//Express and helmet setup
import helmet from 'helmet'
import express from 'express'
const app = express()

app.use(helmet())

//CORS
import { query } from 'graphqurl'

const gqlAPI = process.env.GRAPHQL
const hasuraAdmin = process.env.HASURA_ADMIN
const whiteList = []

const getWhiteList = async function() {
    await query({
        query: `
            query getWhiteList {
                whitelist {
                    origin
                }
            }
        `,
        endpoint: gqlAPI,
        headers: {
            'content-type': 'application/json',
            'x-hasura-admin-secret': hasuraAdmin
        }
    }).then(res => {
        return res.data.whitelist
    })
    .then(res => {
        res.map(value => (
            whiteList.push(value.origin)
        ))
    })
    .catch(err => { throw new Error(err)})
}
getWhiteList()

import cors from 'cors'
const corsOptions = {
    origin: function (origin, callback) {
        if (whitelist.indexOf(origin) !== -1 || !origin) {
          callback(null, true)
        } else {
          callback(new Error('Not allowed by CORS'))
        }
    }
}

app.use(cors(corsOptions))

//listening
const PORT = process.env.PORT || 3001
app.listen(PORT, () => {
    console.log('whitelist:', whiteList)
    console.log(`Listening on PORT: ${PORT}`)
})

输出为“白名单:[]”

有没有一种方法可以让我在开始监听之前等待异步函数结束?

抱歉我的英语不好,我希望你明白我想说的。

谢谢

最佳答案

实现您想要的效果的最简单方法是将 app.listen 方法调用实际包装在 .then 方法中。

准确地说:

getWhiteList().then(() => {
  // [...] More code that might reference the whitelist
  app.listen(PORT, () => {
    console.log('whitelist:', whiteList)
    console.log(`Listening on PORT: ${PORT}`)
  });
});

关于javascript - 在 Express 中的 app.listen 之前等待异步函数完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58728146/

相关文章:

javascript - 谷歌地图 API 无法加载 map 图 block

javascript - 检查 CSS 类是否具有特定属性

mysql - 在不使用ajax的情况下,如何将sql查询结果数据返回到node.js中的调用者函数?

javascript - NodeJS 模块、Chalk 的链接语法是如何工作的?

node.js - 如何在StrongLoop(LoopBack)中获取Response对象

javascript,在 Chrome Web 应用程序中创建窗口,如何包含成功调用新窗口函数的 promise ?

javascript - AnyChart APEX5 集成

node.js - Nodejs mongodb 在不应该返回空数组时返回空数组

node.js - 密码发布无法在 Nodejs 服务器上使用 Reactjs

javascript - Node 电子邮件表单成功消息