Попытка построить броски проекта: требуются функции обратного вызова, но есть [объект Promise]? - PullRequest
0 голосов
/ 23 октября 2018

Я пытаюсь получить доступ к функции, которую позже собираюсь использовать для изменения некоторых значений базы данных.Однако всякий раз, когда я пытаюсь построить проект, я получаю:

Ошибка: Route.post () требует функции обратного вызова, но получает [обещание объекта]

Моя начальная функция:

import fetch from '../../../../core/fetch';
import history from '../../../../core/history';


export const BOXOFFICE_CHECKING_IN = 'BOXOFFICE_CHECKING_IN';
export const BOXOFFICE_CHECKED_IN = 'BOXOFFICE_CHECKED_IN';
export const BOXOFFICE_CHECKED_IN_ERROR = 'BOXOFFICE_CHECKED_IN_ERROR';

export default function checkIn() {
  return async (dispatch, getState) => {
    try {
      dispatch({ type: BOXOFFICE_CHECKING_IN });

      const state = getState();
      const {
        order: {
          id: orderId,
        },
      } = state;

      const response = await fetch(
        `/api/event/orders/${orderId}/checkIn`, {
          method: 'POST',
          headers: {
            Accept: 'application/json',
            'Content-Type': 'application/json',
          },
          body: JSON.stringify({
            order: orderId,
            checkedIn: true,
          }),
        }
      );

      if (response.status === 200) {
        dispatch({ type: BOOKING_CHECKED_IN });
      } else {
        const errorResponse = await response.json();
        if (errorResponse.code === 'card_error') {
          dispatch({ type: BOXOFFICE_CHECKED_IN_ERROR });
        }
      }
    } catch (err) {
      throw err;
    }
  };
}

, который затем подает на API:

import checkIn from '../handlers/api/orders/checkInCustomer';


...

export default (resources) => {
  const router = new Router();

...

  router.post('/orders/:orderId/checkIn', checkIn(resources));

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

export default async function checkIn(req, res) {

console.log('this is working fully');
    return true;
}

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 23 октября 2018

Проблема в том, что вы хотите передать функцию checkIn, но когда вы вызываете ее, используя checkIn(resources), вы фактически передаете возвращаемое значение (обещание, которое разрешается до true).

Вы должны использовать:

router.post('/orders/:orderId/checkIn', checkIn);

Теперь, я предполагаю, что вы хотите сделать это, потому что вы хотите передать ресурсы в функцию router.post, правильно?Что происходит с объектами request и response?

                                 Where does resources go?
                                      v
export default async function checkIn(req, res) {
    console.log('this is working fully');
    return true;
}

У вас есть несколько способов выполнить то, что вы ищете.

  1. Создатьфайл ресурсов и импортируйте его.Это идеальное решение:

    const db = mysql.connect(...);
    const lang = lang.init();
    
    console.log('This file is only called once!');
    
    export default {
        db,
        lang,
    };
    

    И затем в вашем коде (/routes/checkIn.js):

    import { db } from '../resources';
    
    export default async function checkIn(req, res) {
        //Access db here
        //db.query...
    }
    
  2. Оберните ваш код в промежуточныйФункция:

    router.post('/orders/:orderId/checkIn', (req, res) => checkIn(req, res, resources));
    
  3. Bind() ресурсы для вашей проверки регистрации Функция:

    const db = mysql.connect(...);
    const lang = lang.init();
    const resources = {db, lang};
    
    router.post('/orders/:orderId/checkIn', checkIn.bind(resources));
    

    А затем в вашем коде (/ маршруты /checkIn.js):

    export default async function checkIn(req, res) {
        //Access this.db here
        //this.db.query...
    }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...