Открыть URL-адрес в приложении React через узел и экспресс

#node.js #reactjs #express #axios #material-ui

#node.js #reactjs #выразить #axios #материал-пользовательский интерфейс

Вопрос:

Я пытаюсь открыть предоставленный пользователем URL-адрес в reactjs приложении через node.js и express .

Я использую material-ui и axios . Пожалуйста, найдите ниже код для пользовательского интерфейса.

На самом деле это POC для проекта UX-тестирования, где указан URL-адрес тестируемого приложения, и это приложение будет открыто в родительском (основном) приложении для тестирования.

введите описание изображения здесь

UrlForm.js

 import React from 'react';
import PropTypes from 'prop-types';
import { withStyles } from '@material-ui/core/styles';
import Paper from '@material-ui/core/Paper';
import TextField from '@material-ui/core/TextField';
import Button from '@material-ui/core/Button';
import axios from 'axios';

const styles = theme => ({
  container: {
    display: 'flex',
    flexWrap: 'wrap',
  },
  textField: {
    marginLeft: theme.spacing.unit,
    marginRight: theme.spacing.unit,
  },
  dense: {
    marginTop: 16,
  },
  menu: {
    width: 200,
  },
  root: {
    ...theme.mixins.gutters(),
    paddingTop: theme.spacing.unit * 2,
    paddingBottom: theme.spacing.unit * 2,
  },
  button: {
    margin: theme.spacing.unit,
  },
});

class UrlForm extends React.Component {
  state = {
    url: ''
  };

  handleChange = name => event => {
    this.setState({
      [name]: event.target.value,
    });
  };

  sendData = () => {
    console.log(this.state.url);
    axios.post("http://localhost:3001/openurl", { url: this.state.url })
       .then(res => console.log('Data send'))
       .catch(err => console.log(err.data))
    }

  render() {
    const { classes } = this.props;

    return (
        <Paper className={classes.root} elevation={1}>
      <form className={classes.container} noValidate autoComplete="off">
        <TextField
          id="outlined-name"
          label="URL"
          className={classes.textField}
          value={this.state.url}
          onChange={this.handleChange('url')}
          margin="normal"
          variant="outlined"
        />

        <Button variant="outlined" color="primary" onClick={() => { this.sendData(); }} size="small" className={classes.button}>
            Open
        </Button>
    </form>
    </Paper>
    );
  }
}

UrlForm.propTypes = {
  classes: PropTypes.object.isRequired,
};

export default withStyles(styles)(UrlForm);
  

Здесь я отправляю URL-адрес для открытия в пользовательском интерфейсе.

Для сервера, который я использую express-generator , и ниже приведен код для маршрутизатора. Также cors задаются заголовки using и .

app.js

 app.use((req, res, next) => {
    // Check if the origin is whitelisted in the env vars
    res.set({
      // standard CORS headers
      'Access-Control-Allow-Origin': 'http://localhost:3000',
      'Access-Control-Allow-Headers': 'Content-Type, Authorization, Accept, Accept-Language',
      'Access-Control-Allow-Credentials': true,
      'Access-Control-Allow-Methods': 'GET, POST, OPTIONS, PUT, PATCH, DELETE',

      // addresses security issues identified by automated pen testing
      'X-Frame-Options': 'DENY',
      'X-Content-Type-Options': 'nosniff',
      'X-XSS-Protection': 1,
    });
    next();
  });
  

routes/index.js

 // routes/index.js

import express from 'express';
var router = express.Router();

/* GET home page. */
router.get('/', function(req, res, next) {
  res.render('index', { title: 'Express' });
});

router.post('/openurl', function(req, res, next) {
  console.log(req);
  console.log(res);
})

export default router;
  

В route / openurl я получаю URL-адрес в req.body. Как мне получить данный URL-ответ и отправить его клиенту, чтобы открыть его в пользовательском интерфейсе?

Это правильный способ или нет? Поскольку я ищу возможные варианты.

Комментарии:

1. Что вы подразумеваете под «открытым»? где вы хотите его открыть? в браузере или на вашем узловом сервере? вы хотели бы получить доступ к html на сервере?

2. @Beaulne добавил скриншот для справки. И измененное описание.

3. Извините, что вы подразумеваете под открытым? например, для отображения веб-сайта URL-адрес выполняет строку URL http://www.theurl.com -адреса?

4. @Beaulne да, веб-сайт отображается в приложении, и этот URL-адрес веб-сайта будет указан пользователем.

Ответ №1:

Вам нужно выполнить вызов get для URL-адреса пользователя, чтобы получить ответ :

Сначала установите axiosn

 npm install axios
  

затем в вашем приложении node :

 const axios = require('axios');

router.post('/openurl', function(req, res, next) {

let url = req.body.url ; 

axios.get(url)
  .then(function (response) {

  //do what's you want with response

    console.log(response.data);
    res.json({  content :  response.data});

  })
  .catch(function (error) {
    console.log(error);
  })


})
  

Или просто простым способом вы можете создать Iframe в своем приложении react и отобразить URL-адрес, предоставленный use

Комментарии:

1. спасибо за ответ. да, iFrame является одним из вариантов, но я стараюсь избегать этого, поскольку следующим шагом будет делать скриншот данного URL-адреса через регулярные промежутки времени, пока пользователь взаимодействует с этим открытым URL.

2. Если вы хотите только сделать снимок экрана, попробуйте node-webshot — очень хороший пакет: github.com/brenden/node-webshot

3. да, я видел это и буду использовать его на следующем этапе. в ответе, который вы дали, мне нужно отправить ответ. данные клиенту и отобразить их в элементе html, верно?