Дождитесь завершения асинхронной функции, прежде чем app.listen в Express - PullRequest
0 голосов
/ 06 ноября 2019

Я пытался взять whiteList из 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}`)
})

вывод - 'белый список: []'

Есть ли метод, в котором я могу дождаться окончания асинхронной функции перед началом прослушивания?

Извините за мой плохой английский, янадеюсь, вы понимаете, что я пытаюсь сказать.

Спасибо

Ответы [ 2 ]

0 голосов
/ 06 ноября 2019

Оберните его в самовывозную асинхронную функцию, я думаю, что она будет работать

(async () => {

const whiteList = await getWhiteList();

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}`)
})

})()
0 голосов
/ 06 ноября 2019

Самый простой способ добиться того, чего вы хотите, - это фактически обернуть вызов метода 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}`)
  });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...