Javascript 当我返回一个函数时,我得到一个未定义的结果

Javascript 当我返回一个函数时,我得到一个未定义的结果,javascript,node.js,socket.io,serial-port,Javascript,Node.js,Socket.io,Serial Port,这是我的server.js代码。在服务器文件中,我连接Arduino端口,并使用socket.io将从串行端口获取的数据发送到站点,以便从串行端口读取实时输出。Arduino的输出数据仅为数字,没有字符串和任何其他数据类型 const path = require("path"); const http = require("http"); const express = require("express"); const socket

这是我的server.js代码。在服务器文件中,我连接Arduino端口,并使用socket.io将从串行端口获取的数据发送到站点,以便从串行端口读取实时输出。Arduino的输出数据仅为数字,没有字符串和任何其他数据类型

const path = require("path");
const http = require("http");
const express = require("express");
const socketio = require("socket.io");

const serialPort = require("serial-node");
const serialList = new serialPort().list;

const SerialPort = require("serialport");
const Readline = require("@serialport/parser-readline");
const inp_out = require("console-read-write");

const serial = new serialPort();
const fs = require("fs");

const app = express();
const server = http.createServer(app);
const io = socketio(server);

const PORT = 3000 || process.env.PORT;

// Set static folder
app.use(express.static(path.join(__dirname, "public")));

const getPortsList = async () => {
  const ports = await SerialPort.list();
  ports.forEach((port) => {
    var portInfo = {
      portPath: port.path,
      portManufacturer: port.manufacturer,
    };
    console.log("Port:", portInfo);
  });
};

var portConnect;
getPortsList().then(async () => {
  var a = "COM" + (await inp_out.ask("Enter the port Number:"));
  console.log(`You are connecting to ${a}`);
  const portConnect = new SerialPort(`${a}`);
  const parser = portConnect.pipe(new Readline({ delimiter: "\n" }));
  io.on("connection", (socket) => {
    parser.on("data", (e) => {
      for (var i = 0; i < 1; i++) {
        socket.emit("message", e);
        break;
      }
    });
  });
});

// Run when clients connects
server.listen(PORT, () => {
  console.log(`Server running on port: ${PORT}`);
});
const path=require(“路径”);
const http=require(“http”);
const express=要求(“express”);
const socketio=require(“socket.io”);
const serialPort=require(“串行节点”);
const serialList=new serialPort().list;
const SerialPort=require(“SerialPort”);
const Readline=require(“@serialport/parser Readline”);
const inp_out=require(“控制台读写”);
const serial=new serialPort();
常数fs=要求(“fs”);
常量app=express();
const server=http.createServer(app);
常量io=socketio(服务器);
const PORT=3000 | | process.env.PORT;
//设置静态文件夹
app.use(express.static(path.join(u dirname,“public”));
const getPortsList=async()=>{
const port=wait SerialPort.list();
ports.forEach((端口)=>{
var portInfo={
portPath:port.path,
端口制造商:端口制造商,
};
日志(“端口:”,portInfo);
});
};
var-portConnect;
getPortsList()。然后(异步()=>{
var a=“COM”+(等待输入输出。询问(“输入端口号:”);
log(`您正在连接到${a}`);
const-portConnect=new-SerialPort(`${a}`);
const parser=portConnect.pipe(新的读线({分隔符:“\n”}));
io.on(“连接”,“插座)=>{
parser.on(“数据”,(e)=>{
对于(变量i=0;i<1;i++){
socket.emit(“message”,e);
打破
}
});
});
});
//当客户端连接时运行
服务器。侦听(端口,()=>{
log(`Server running on port:${port}`);
});
这是我的index.js代码

const socket = io();

var messageToClient;
const button = document.getElementById("button");
var a;
function fetchData() {
  socket.on("message", (message) => {
    for (var i = 0; i < 1; i++) {
      a = OutMessage(message);
      console.log(a);
    }
  });
  return a;
}

button.addEventListener("click", () => {
  document.getElementById("textDataIo").innerHTML = fetchData();
});

function OutMessage(message) {
  messageToClient = message;
  //console.log(messageToClient);
  return message;
}
const socket=io();
var-messageToClient;
const button=document.getElementById(“按钮”);
var a;
函数fetchData(){
socket.on(“消息”,(消息)=>{
对于(变量i=0;i<1;i++){
a=输出消息(消息);
控制台日志(a);
}
});
返回a;
}
按钮。addEventListener(“单击”,()=>{
document.getElementById(“textDataIo”).innerHTML=fetchData();
});
函数输出消息(消息){
messageToClient=消息;
//console.log(messageToClient);
返回消息;
}
这是我的index.html文件

<div class="main-container">
      <button id="button" class="textData">click here</button>
      <p id="textDataIo">Hi, I will get data from backend</p>
  </div>

点击这里
你好,我将从后端获取数据


当我点击按钮时,我应该从Arduino获取数据。但是,当我单击按钮时,我的定义变得不明确。

socket.on是一个异步函数,在socket.on函数之前运行行
return a
return a
是在
套接字.on
处理程序之外完成的,因此,由于socket.on hander只在
消息
事件发生时运行,因此在将任何内容分配给
a
之前,您正在返回-哦,移动返回将没有帮助-您需要学习如何处理异步