Node.js 获取节点变量以响应组件
我启动了一个电子应用程序 我使用来自节点的child_进程,如:Node.js 获取节点变量以响应组件,node.js,reactjs,material-ui,textfield,child-process,Node.js,Reactjs,Material Ui,Textfield,Child Process,我启动了一个电子应用程序 我使用来自节点的child_进程,如: function func() { spawn('powershell.exe', ["ls"], (error, stdout, stderr) => { if (error) { console.error(`exec error: ${error}`); return; } log = stdout ; console.log(`stdout: ${stdout}`); } console
function func() {
spawn('powershell.exe', ["ls"], (error, stdout, stderr) => {
if (error) {
console.error(`exec error: ${error}`);
return;
}
log = stdout ;
console.log(`stdout: ${stdout}`);
}
console.error(`stderr: ${stderr}`);
}
);
}
我想将stdout(或log)放入react组件(在同一个js文件中)
import React,{useState}来自“React”;
从“@material ui/core/Button”导入按钮;
从“@material ui/core/TextField”导入TextField;
//节点
var spawn=require('child_process').execFile;
var测井;
函数func(){
spawn('powershell.exe',[“ls”],(错误,stdout,stderr)=>{
如果(错误){
错误(`exec error:${error}`);
返回;
}
log=stdout;
log(`stdout:${stdout}`);
}
错误(`stderr:${stderr}`);
}
);
}
函数极小(){
const[ShowGithubDialog,setShowGithubDialog]=React.useState(null);
const[GitLocalRepo,setGitLocalRepo]=React.useState(null);
返回(
{
func();
}}
>
开始
);
}
导出默认值最小;
当我点击按钮时,该命令起作用,我可以在控制台上看到结果,但Textfield不显示stdout值(我也尝试使用log)。
我不明白,我错过了什么?你不能这样做
React组件在客户端上呈现。除非使用API,否则它们与服务器的交互绝对为零。如果您想记录内容,只需使用console.log(…)
并查看浏览器控制台
如果必须在服务器端登录,则需要设置一个API来接受来自客户端的请求,并将请求正文打印到服务器上运行的控制台。这可以使用Express JS实现:
const express=require('express');
const cors=需要(“cors”);
常量app=express();
应用程序使用(cors);
use(bodyParser.json());
use(bodyParser.urlencoded({extended:true}));
app.post('/log',(req,res)=>{
日志(“收到的日志请求:”,请求主体消息);
物质状态(200);
});
app.listen(3001,()=>console.log(“API正在运行”);
然后在组件中:
函数func(){
取('http://localhost:3001', {
方法:“POST”,
正文:{消息:'这将被记录!'
});
}
未经测试但应能正常工作我使用IPC和userRef(非受控组件)并按预期工作 首先,你忘了解释这两者是如何有着千丝万缕的联系的。React代码通常在客户机上运行,因此,除非您能够解释组件如何能够与节点通信,否则这里的答案显然是“两者完全不相关”。这是你正在做的预捆绑吗?如果是这样,谈谈你的捆绑是如何工作的。至少,将其转换为一个.I更新,添加如何启动脚本。这是一个简单但没有帮助的问题:您显示的代码没有告诉我们它实际上是如何运行的。React在浏览器中不需要节点服务器就可以在任何地方运行,那么其余的代码在哪里呢?请认真对待这个请求:我们不知道你在做什么,也不知道你的代码是什么样子,也不知道你头脑中的任何东西,但不在帖子中:更新你的帖子来展示它是如何运行的,所有与这个特定问题无关的东西都被去掉了,所以这可能意味着一个非常短的Node.js脚本,还有一个很短的React应用程序,以及如何运行的说明。我更新了完整的示例(我希望)我必须安装express?电子能代替它吗?我不需要快递。我可以从我的react组件(Buton)启动我的节点函数(child_进程)。我唯一需要的是将结果值转换成另一个react组件。我想我必须创建一个定制的eventI搜索并找到userefhook。我试试这个
import React, { useState } from 'react';
import Button from '@material-ui/core/Button';
import TextField from '@material-ui/core/TextField';
// node
var spawn = require('child_process').execFile;
var log;
function func() {
spawn('powershell.exe', ["ls"], (error, stdout, stderr) => {
if (error) {
console.error(`exec error: ${error}`);
return;
}
log = stdout ;
console.log(`stdout: ${stdout}`);
}
console.error(`stderr: ${stderr}`);
}
);
}
function Minimal() {
const [ShowGithubDialog, setShowGithubDialog] = React.useState(null);
const [GitLocalRepo, setGitLocalRepo] = React.useState(null);
return (
<div>
<Button
variant="contained"
color="primary"
// className={classes.button}
onClick={() => {
func();
}}
>
Start
</Button>
<TextField
id="filled-multiline-static"
multiline
fullWidth
rows="15"
defaultValue="Welcome"
variant="outlined"
value={log}
inputProps={{
readOnly: true
}}
/>
</div>
);
}
export default Minimal;