#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, верно?