Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Помогите найти SyntaxError (https://javascript.ru/forum/misc/70506-pomogite-najjti-syntaxerror.html)

komplekt_17 11.09.2017 13:56

Помогите найти SyntaxError
 
При сборке билда появляется ошибка

вот сам код
import React, { Component } from 'react';
// Подключаем библиотеку unsplash-js
// (при настроенной webpack-сборке)
import Unsplash from 'unsplash-js';


// Создаем экземпляр объекта для доступа к API
const unsplash = new Unsplash({
  // Application ID из настроек вашего приложения
  applicationId: "8b304f2104e7394c1a13751e65223fec24a86aa32f974953dc0f4634c28e4e9b",
  // Application Secret из настроек вашего приложения
  secret: "6b338b013c7d2d927bd055c83d422d775531d9ea0916a006b2a9c5c3180b31a3",
  // Полный адрес страницы авторизации приложения (Redirect URI)
  // Важно: этот адрес обязательно должен быть указан в настройках приложения на сайте Unsplash API/Developers 
  callbackUrl: "http://www.skart-info.ru/myProjects/diplomajs/"
});

// Генерируем адрес страницы аутентификации на unsplash.com
// и указываем требуемые разрешения (permissions)
const authenticationUrl = unsplash.auth.getAuthenticationUrl([
  "public",
  "write_likes"
]);	

// Считываем GET-параметр code из URL
// [url]www.example.com/auth?code=abcdef123456[/url]...
const code = location.search.split('code=')[1];

class App extends Component{
	// Если код передан, отправляем запрос на получение токена
	if (code) {
		unsplash.auth.userAuthentication(code)
			.then(res => res.json())
			.then(json => {
				// Сохраняем полученный токен
				unsplash.auth.setBearerToken(json.access_token);
			});

		// Теперь можно сделать что-то от имени пользователя
		unsplash.photos.listPhotos(1, 10, "latest")
		.then(res => res.json())
		.then(json => {
			console.log(json);
				return (
					<div>
						{
							json.map(foto => {
								return (
									<div key={foto.id} className="col-md-4 comment">
										<div className="com-span-1">
											<div className="com-name"> {foto.user.name} </div>
											<div className="com-date"> {foto.updated_at} </div>
										</div>
										<div className="text"> {foto.text} 
											<img src={foto.html} />
										</div>
									</div>
								);
							})
						}
					</div>
				);
		});
	}
	 
	// Если кода нет, отправляем пользователя на аутентификацию
	else{	
		location.assign(authenticationUrl);
	}
}

export default App;


Если переделываю на код без класса, то всё нормально билдится, но react выдаёт свою ошибку

stanilar 13.11.2017 21:10

Дык вроде неправильно объявлен класс. В классе вся работа должна идти только через функции.

fearmear.wrk 13.11.2017 21:16

В строке 64 интерпретатор неявно добавляет ; в конец строки, поэтому на else падает.
(А может и нет)

komplekt_17 14.11.2017 11:50

Цитата:

Сообщение от stanilar (Сообщение 469989)
Дык вроде неправильно объявлен класс. В классе вся работа должна идти только через функции.

да не, класс корректно объявлен. Если условную конструкцию убираю, всё корректно работает. Дело именно в If...else

komplekt_17 14.11.2017 11:51

Цитата:

Сообщение от fearmear.wrk (Сообщение 469991)
В строке 64 интерпретатор неявно добавляет ; в конец строки, поэтому на else падает.
(А может и нет)

ну и как от этого избавиться?

komplekt_17 14.11.2017 11:52

ссыль на git
 
добавлю ссылку на весь проект, может это как-то поможет
https://github.com/komplekt17/diplomajs

ruslan_mart 14.11.2017 12:22

Очевидно, что в классе должны быть только методы и свойства, а у Вас там какая-та каша из условий.

Alexandroppolus 14.11.2017 12:35

то что внутри класса, надо "обернуть" в метод render

komplekt_17 14.11.2017 12:52

Цитата:

Сообщение от komplekt_17 (Сообщение 470024)
добавлю ссылку на весь проект, может это как-то поможет
https://github.com/komplekt17/diplomajs

ну так куда условия засунуть? в отдельный метод что ли? вне класса?

komplekt_17 14.11.2017 12:53

Цитата:

Сообщение от Alexandroppolus (Сообщение 470032)
то что внутри класса, надо "обернуть" в метод render

напишите по-конкретнее номера строк, которые нужно обернуть

Nexus 14.11.2017 12:56

komplekt_17, строки 30-69 включительно, если не ошибаюсь.

komplekt_17 14.11.2017 13:23

Цитата:

komplekt_17, строки 30-69 включительно, если не ошибаюсь.
обёртывание не помогло

komplekt_17 14.11.2017 13:25

Цитата:

komplekt_17, строки 30-69 включительно, если не ошибаюсь.
обёртывание не помогло

Nexus 14.11.2017 13:28

Цитата:

Сообщение от komplekt_17
обёртывание не помогло

А как вы "обернули"?

komplekt_17 14.11.2017 13:39

так
import React, { Component } from 'react';
import { render } from 'react-dom'
// Подключаем библиотеку unsplash-js
// (при настроенной webpack-сборке)
import Unsplash from 'unsplash-js';

class App extends Component{
// Создаем экземпляр объекта для доступа к API
const unsplash = new Unsplash({
  // Application ID из настроек вашего приложения
  applicationId: "8b304f2104e7394c1a13751e65223fec24a86aa32f974953dc0f4634c28e4e9b",
  // Application Secret из настроек вашего приложения
  secret: "6b338b013c7d2d927bd055c83d422d775531d9ea0916a006b2a9c5c3180b31a3",
  // Полный адрес страницы авторизации приложения (Redirect URI)
  // Важно: этот адрес обязательно должен быть указан в настройках приложения на сайте Unsplash API/Developers 
  callbackUrl: "http://www.skart-info.ru/myProjects/diplomajs/"
});

// Генерируем адрес страницы аутентификации на unsplash.com
// и указываем требуемые разрешения (permissions)
const authenticationUrl = unsplash.auth.getAuthenticationUrl([
  "public",
  "write_likes"
]);	

// Считываем GET-параметр code из URL
// [url]www.example.com/auth?code=abcdef123456[/url]...
const code = location.search.split('code=')[1];

render(
		// Если код передан, отправляем запрос на получение токена
		{ code ? (
				unsplash.auth.userAuthentication(code)
				.then(res => res.json())
				.then(json => {
					// Сохраняем полученный токен
					unsplash.auth.setBearerToken(json.access_token);
				});

				// Теперь можно сделать что-то от имени пользователя
				unsplash.photos.listPhotos(1, 10, "latest")
				.then(res => res.json())
				.then(json => {
					//console.log(json);
					return (
						<div>
							{
								json.map(foto => {
									return (
										<div key={foto.id} className="col-md-4 comment">
											<div className="com-span-1">
												<div className="com-name"> {foto.user.name} </div>
												<div className="com-date"> {foto.updated_at} </div>
											</div>
											<div className="text"> {foto.text} 
												<img src={foto.links.html} />
											</div>
										</div>
									);
								})
							}
						</div>
					)
				})
			) : (location.assign(authenticationUrl));
		}
	);
	 
	
}

export default App;

Nexus 14.11.2017 13:45

komplekt_17, попробуйте так:
import React, { Component } from 'react';
// Подключаем библиотеку unsplash-js
// (при настроенной webpack-сборке)
import Unsplash from 'unsplash-js';


// Создаем экземпляр объекта для доступа к API
const unsplash = new Unsplash({
  // Application ID из настроек вашего приложения
  applicationId: "8b304f2104e7394c1a13751e65223fec24a86aa32f974953dc0f4634c28e4e9b",
  // Application Secret из настроек вашего приложения
  secret: "6b338b013c7d2d927bd055c83d422d775531d9ea0916a006b2a9c5c3180b31a3",
  // Полный адрес страницы авторизации приложения (Redirect URI)
  // Важно: этот адрес обязательно должен быть указан в настройках приложения на сайте Unsplash API/Developers 
  callbackUrl: "http://www.skart-info.ru/myProjects/diplomajs/"
});

// Генерируем адрес страницы аутентификации на unsplash.com
// и указываем требуемые разрешения (permissions)
const authenticationUrl = unsplash.auth.getAuthenticationUrl([
  "public",
  "write_likes"
]);	

// Считываем GET-параметр code из URL
// [url]www.example.com/auth?code=abcdef123456[/url]...
const code = location.search.split('code=')[1];

class App extends Component{
	render(){
		// Если код передан, отправляем запрос на получение токена
		if (code) {
			unsplash.auth.userAuthentication(code)
				.then(res => res.json())
				.then(json => {
					// Сохраняем полученный токен
					unsplash.auth.setBearerToken(json.access_token);
				});

			// Теперь можно сделать что-то от имени пользователя
			unsplash.photos.listPhotos(1, 10, "latest")
			.then(res => res.json())
			.then(json => {
				console.log(json);
					return (
						<div>
							{
								json.map(foto => {
									return (
										<div key={foto.id} className="col-md-4 comment">
											<div className="com-span-1">
												<div className="com-name"> {foto.user.name} </div>
												<div className="com-date"> {foto.updated_at} </div>
											</div>
											<div className="text"> {foto.text} 
												<img src={foto.html} />
											</div>
										</div>
									);
								})
							}
						</div>
					);
			});
		}
		 
		// Если кода нет, отправляем пользователя на аутентификацию
		else{	
			location.assign(authenticationUrl);
		}
	}
}

export default App;

komplekt_17 14.11.2017 13:47

в вашем варианте кода надо подключать реактовский рендер?
import { render } from 'react-dom'

komplekt_17 14.11.2017 13:53

Цитата:

Сообщение от Nexus (Сообщение 470047)
komplekt_17, попробуйте так:
import React, { Component } from 'react';
// Подключаем библиотеку unsplash-js
// (при настроенной webpack-сборке)
import Unsplash from 'unsplash-js';


// Создаем экземпляр объекта для доступа к API
const unsplash = new Unsplash({
  // Application ID из настроек вашего приложения
  applicationId: "8b304f2104e7394c1a13751e65223fec24a86aa32f974953dc0f4634c28e4e9b",
  // Application Secret из настроек вашего приложения
  secret: "6b338b013c7d2d927bd055c83d422d775531d9ea0916a006b2a9c5c3180b31a3",
  // Полный адрес страницы авторизации приложения (Redirect URI)
  // Важно: этот адрес обязательно должен быть указан в настройках приложения на сайте Unsplash API/Developers 
  callbackUrl: "http://www.skart-info.ru/myProjects/diplomajs/"
});

// Генерируем адрес страницы аутентификации на unsplash.com
// и указываем требуемые разрешения (permissions)
const authenticationUrl = unsplash.auth.getAuthenticationUrl([
  "public",
  "write_likes"
]);	

// Считываем GET-параметр code из URL
// [url]www.example.com/auth?code=abcdef123456[/url]...
const code = location.search.split('code=')[1];

class App extends Component{
	render(){
		// Если код передан, отправляем запрос на получение токена
		if (code) {
			unsplash.auth.userAuthentication(code)
				.then(res => res.json())
				.then(json => {
					// Сохраняем полученный токен
					unsplash.auth.setBearerToken(json.access_token);
				});

			// Теперь можно сделать что-то от имени пользователя
			unsplash.photos.listPhotos(1, 10, "latest")
			.then(res => res.json())
			.then(json => {
				console.log(json);
					return (
						<div>
							{
								json.map(foto => {
									return (
										<div key={foto.id} className="col-md-4 comment">
											<div className="com-span-1">
												<div className="com-name"> {foto.user.name} </div>
												<div className="com-date"> {foto.updated_at} </div>
											</div>
											<div className="text"> {foto.text} 
												<img src={foto.html} />
											</div>
										</div>
									);
								})
							}
						</div>
					);
			});
		}
		 
		// Если кода нет, отправляем пользователя на аутентификацию
		else{	
			location.assign(authenticationUrl);
		}
	}
}

export default App;

тоже не робит

Nexus 14.11.2017 13:53

komplekt_17, не знаю, я больше в backend.

komplekt_17 14.11.2017 14:04

Цитата:

Сообщение от Nexus (Сообщение 470052)
komplekt_17, не знаю, я больше в backend.

я так и понял, все-равно мерси

ruslan_mart 14.11.2017 17:40

Цитата:

Сообщение от komplekt_17
import { render } from 'react-dom'

Это не нужно.


Метод render должен возвращать сам компонент.

stanilar 14.11.2017 21:11

Таки класс объявлен некорректно. Корректно - в классе должны быть только методы(то, как Вам посоветовал оформить код Nexus).
Так что показывайте ошибку, а то получается испорченный телефон.

Да, кстати, render не подразумевает то, что Вы вернете результат функции через промис( и уж тем более того, что результата вообще не будет). Результат надо возвращать сразу, причем именно в виде реактовского дерева.

Для реакции на изменившееся окружение нужны другие методы. Нужно работать через state реактовских компонент.Как то так(пишу по памяти):
class App extends Component{
  constructor(props) {
    //Конструктор класса, выполняется при создании объекта.
    super(props);
    this.state = {
      color: 1,
    };
   this.authrequest = this.authrequest.bind(this);
  }

  authrequest () {
  //Здесь запрос к серверу с ответом, по которому, будет изменен цвет компонента. Нужно использовать именно setState - иначе реакт не поймет что окружение изменилось
  ...
  ля - ля - ля а затем
  this.setState({color: 2,});
  }

  componentDidMount(){
  // Метод жизненного цикла компонента, будет вызван после того, как объект создан и задеплоен в виртуальное дерево. Стоит обратить внимание, что метод render будет вызван до вызова этого метода.
  this.authrequest();
  }


  render(){
  // Вызывается каждый раз, когда изменяется внутренне состояние компонента.
  const {color} = this.state;
  let cmp = null; // тот компонент, который отрисуется в зависимости от переменной color
  if (color===1){
    cmp = (<div>1<div>);
  } else {
    cmp = (<div>2<div>);
  }

  return (<div>
                {cmp }
             <div>);
  }

}


Часовой пояс GMT +3, время: 06:21.