Meteor js обрабатывает очищенные данные от сервера к клиенту, возвращает undefined - PullRequest
0 голосов
/ 28 мая 2020

Я пытаюсь получить предварительный просмотр URL-адреса для моего приложения Meteor + React, где, когда пользователи вставляют URL-адрес в текстовое поле, они получают предварительный просмотр URL-адреса. Я планирую добиться этого, используя несколько модулей npm, например:

  1. url-regex и
  2. open-graph-scraper

Я понимаю, что во избежание проблем с CORS запрос должен выполняться на стороне сервера. Итак, в настоящее время у меня настроено следующее:

// на клиенте

import urlRegex from 'url-regex';
const onTextareaChange = e => {
    let value = e.target.value;
    let testURL = urlRegex().test(value) //returns true if url exists in textarea
    console.log(testURL);
    if(testURL){
        let extractURL = value.match(urlRegex()) //extract the url
        extractURL.map(url =>{
            console.log(url)
            Meteor.call('scrapeURL',{url}, function (result){
                 console.log(result)         
            })

        })
    }
    /* console.log(e.target.value) */
    setTextarea(e.target.value)
 }

// на сервере

import ogs from 'open-graph-scraper';
/* 24. scrapeURL */
'scrapeURL' ({url}){
  new SimpleSchema({
    url : { type  : String }
  }).validate({url})
  if(!Meteor.userId){
    throw new Meteor.Error('not-authorised!')
  } else {
    let options = { 'url': url };
      ogs(options)
        .then(function (result) {
          console.log('result:', result);
          return result;
        })
        .catch(function (error) {
          console.log('error:', error);
        });
  }
}    

Проблема здесь в том, что когда я пытался console.log the results на сервере, очищенные данные отображаются в консоли сервера. но когда я попытался вернуть results с сервера клиенту, console.log на клиенте показывает undefined.

Я понятия не имею, что не так с кодом.

1 Ответ

2 голосов
/ 28 мая 2020

Ваша функция scrapeUrl не возвращает никаких данных (вы только описали, что будет возвращать функция .then()), вы должны попробовать это:

import ogs from 'open-graph-scraper';
/* 24. scrapeURL */
'scrapeURL' ({url}){
  new SimpleSchema({
    url : { type  : String }
  }).validate({url})
  if(!Meteor.userId){
    throw new Meteor.Error('not-authorised!')
  } else {
    let options = { 'url': url };

    // here return the full promise : 
    return ogs(options)
        .then(function (result) {
          console.log('result:', result);
          return result;
        })
        .catch(function (error) {
          console.log('error:', error);
          // probably here a need to tell the client that there was an error
          //throw new Meteor.Error(error);
        });
  }
}   

Вот хорошее чтение в среде о использование обещаний в Meteor: https://blog.meteor.com/using-promises-and-async-await-in-meteor-8f6f4a04f998

...