Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 获取节点变量以响应组件_Node.js_Reactjs_Material Ui_Textfield_Child Process - Fatal编程技术网

Node.js 获取节点变量以响应组件

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

我启动了一个电子应用程序

我使用来自节点的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.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;