Поэтому я использую WooCommerce API, чтобы предлагать продукты моего текущего WordPress. Я использую Nestjs для серверной части и Postman для выполнения запросов.
Вот мой контроллер
@Controller('game')
export class GameController {
constructor(private readonly gameService: GameService) {}
@Get()
findAll() {
this.gameService.test().then((data) => {
return data;
});
}
}
И вот моя служба, где я подключаюсь к WooCommerce API.
import WooCommerce from '../config/woocomerce.config';
@Injectable()
export class GameService implements GameServiceInterface {
async test() {
try {
const response = WooCommerce.get('products');
response.then((data) => {
console.info(data.data);
});
} catch (err) {
return `Error! ${err}`;
}
}
}
Проблема в том, что когда я консолью регистрирую поле данных обещания, оно работает нормально! Вот вывод
[
gm-commerce-backend | {
gm-commerce-backend | id: 10,
gm-commerce-backend | name: 'Test product',
gm-commerce-backend | slug: 'test-product',
gm-commerce-backend | permalink: 'http://wordpress/product/test-product/',
gm-commerce-backend | date_created: '2020-12-21T14:27:07',
gm-commerce-backend | date_modified: '2020-12-21T14:27:14',
gm-commerce-backend | type: 'simple',
gm-commerce-backend | status: 'publish',
gm-commerce-backend | featured: false,
gm-commerce-backend | catalog_visibility: 'visible',
gm-commerce-backend | description: '<p>This is a test product for the WooCommerce API connection</p>\n',
gm-commerce-backend | short_description: '',
gm-commerce-backend | sku: '',
gm-commerce-backend | price: '588',
gm-commerce-backend | regular_price: '2002',
gm-commerce-backend | sale_price: '588',
gm-commerce-backend | date_on_sale_from: '',
gm-commerce-backend | date_on_sale_to: '',
gm-commerce-backend | price_html: '<del><span class = "woocommerce-Price-amount
amount"><bdi><span class = "woocommerce-Price-currencySymbol">$</span>2,002.00</bdi></span></del> <ins><span class = "woocommerce-Price-amount amount"><bdi><span class = "woocommerce-Price-currencySymbol">$</span>588.00</bdi></span></ins>',
gm-commerce-backend | on_sale: true,
gm-commerce-backend | purchasable: true,
gm-commerce-backend | total_sales: 0,
gm-commerce-backend | virtual: false,
gm-commerce-backend | downloadable: false,
gm-commerce-backend | downloads: [],
gm-commerce-backend | download_limit: -1,
gm-commerce-backend | download_expiry: -1,
gm-commerce-backend | download_type: 'standard',
gm-commerce-backend | external_url: '',
gm-commerce-backend | button_text: '',
gm-commerce-backend | tax_status: 'taxable',
gm-commerce-backend | tax_class: '',
gm-commerce-backend | manage_stock: false,
gm-commerce-backend | stock_quantity: null,
gm-commerce-backend | in_stock: true,
gm-commerce-backend | backorders: 'no',
gm-commerce-backend | backorders_allowed: false,
gm-commerce-backend | backordered: false,
gm-commerce-backend | sold_individually: false,
gm-commerce-backend | weight: '',
gm-commerce-backend | dimensions: { length: '', width: '', height: '' },
gm-commerce-backend | shipping_required: true,
gm-commerce-backend | shipping_taxable: true,
gm-commerce-backend | shipping_class: '',
gm-commerce-backend | shipping_class_id: 0,
gm-commerce-backend | reviews_allowed: true,
gm-commerce-backend | average_rating: '0.00',
gm-commerce-backend | rating_count: 0,
gm-commerce-backend | related_ids: [],
gm-commerce-backend | upsell_ids: [],
gm-commerce-backend | cross_sell_ids: [],
gm-commerce-backend | parent_id: 0,
gm-commerce-backend | purchase_note: '',
gm-commerce-backend | categories: [ [Object] ],
gm-commerce-backend | tags: [],
gm-commerce-backend | images: [ [Object] ],
gm-commerce-backend | attributes: [],
gm-commerce-backend | default_attributes: [],
gm-commerce-backend | variations: [],
gm-commerce-backend | grouped_products: [],
gm-commerce-backend | menu_order: 0,
gm-commerce-backend | _links: { self: [Array], collection: [Array] }
gm-commerce-backend | }
gm-commerce-backend | ]
Но в Postman ничего не появляется. Я получаю пустую страницу.
Это вывод почтальона
Чего мне ожидать? Я ожидаю того же результата, что и в моей консоли, но в почтальоне.
Но если я верну свое обещание в свой контроллер, я не смогу выполнить обещание.
Что вы подразумеваете под "обработкой"? У вас все еще может быть .then
, и все, что вы вернете туда, будет разрешенными данными.
так что в моей службе я бы сделал что-то вроде const response = WooCommerce.get('products'); return response;
Но тогда вы не ждете обещания. Просто для ясности, вы понимаете, что вы не можете просто return
что-то из .then
в findAll
и ожидать, что это будет возвращаемое значение вызова findAll
? findAll
необходимо вернуть промис, иначе как вы сможете дождаться его разрешения? В вашем служении вы уже делаете это с response.then
. Просто вы не возвращаете это Обещание в findAll
...
Вы должны добавить async
, а затем вернуть результат обещания gamsService в Controller.
@Controller('game')
export class GameController {
constructor(private readonly gameService: GameService) {}
@Get()
async findAll() {
// you also could not add await, nestjs will help you to get the promise value.
// it'll work with or without adding await.
return await this.gameService.test()
}
}
Вам также необходимо вернуть обещание в Service.
import WooCommerce from '../config/woocomerce.config';
@Injectable()
export class GameService implements GameServiceInterface {
async test() {
try {
// return all fields
return WooCommerce.get('products');
// return only header field
const config = await WooCommerce.get('products')
return {
header: config.header
}
} catch (err) {
return `Error! ${err}`;
}
}
}
Примечание: вы могли видеть nesjs - Асинхронность
Это сработало, я читал, что гнездо разрешает обещание, но что, если я хочу получить доступ к определенному полю своих данных, мне не нужны все мои данные .then, я хочу, давайте возьмем в качестве примера: data.header
Спасибо!! теперь он работает отлично. Итак, чтобы быть ясным и в учебных целях, в моем контроллере я всегда должен возвращать обещание, верно?
Когда вы добавляете асинхронность перед функцией, все, что вы возвращаете, является значением обещания.
Вы, наверное, хотите
return
этоPromise
вfindAll
.