NodeJS 正在将一个脚本运行到另一个脚本中

问题描述

我创建了一个 TCP 服务器来接收来自某些设备的信息,我想从这个服务器创建一个 API,我导出了两个变量以便在 API 中使用它们。 当我这样做时,我的服务器在我的另一个进程中启动,使它们同时执行,我不知道为什么会发生这种情况

//server.js

const { title,BL_url,puerto_controladores,puerto_api } = require('...')
process.title = title;

var net = require('net');

var sockets = []; 
var socketsID = [];
var lastConnected = [];


var server = net.createServer( function (socket) {

    socket.name = socket.remoteAddress + ":" + socket.remotePort;

    sockets.push(socket);
    socketsID.push(socket.name.substr(7));

    console.log(socket.name + ' connected.');

    socket.on('data',(data) => {
        textChunk = data.toString('utf8').substr(1,data.toString('utf8').length-2);
        console.log('Mensaje de ' + socket.name.substr(7) + 
    socket.on('close',() =>{
        console.log(socket.name + " desconectado.");
    });
    socket.on('error',(error) =>{
        console.log('Error del Cliente TCP: ' + puerto_controladores,error.code,error.message);
    });
    
});

server.on('error',(error) => {
    console.log('Error del Server TCP: ' + puerto_controladores,error.message);
});

server.listen(puerto_controladores,()=>{
    setInterval(() => {
        webMethods.sendInterval();
    },180000);

    
    console.log("Server listening at : " + puerto_controladores);
});
//setInterval(()=>{
    module.exports = {sockets,socketsID};

另一方面:

const {sockets,socketsID} = require('..server.js');
const {titleProcess,port} = require('...');
process.title = titleProcess;
const express = require('express');
const bodyParser = require('body-parser');

const app = express();
app.listen(port,() => {
    console.log('Listening at :',port);
});

app.get('/',(req,res)=>{
    console.log(test.sockets,test.socketsID);
    res.status(200).json({
        mensaje: 'received',})
})

无论我在 server.js 中做什么,module.export 的打印,一个新变量,包括命令提示符中的进程标题等,它都在 API.js 控制台中运行

//API Output: 
Server listening at : 9006
Listening at : 4002
{ sockets: [],socketsID: [] }
{ sockets: [],socketsID: [] }

//Server Output:
Error del Server TCP: 9006 listen EADDRINUSE: address already in use :::9006

解决方法

nodejs 中的 useEffect(() => { checkForActive.then(data => { // Do things with data setActive(true); }); },[]); 对象属于一个特定的进程。您不能简单地与另一个进程共享它们。如果您希望一个进程在另一个进程拥有的套接字上发送数据,则使用不同的服务器将数据本身发送到另一个进程,并发送一些带有数据的标识符,接收进程可以使用该标识符来确定哪个套接字数据应该被发送到,然后它会通过它拥有的套接字发送数据。但是,这整件事听起来像是一种非常令人困惑的做事方式。

例如,假设您有 serverTCP(来自 server.js 的普通 TCP 服务器)和 serverAPI(来自其他文件的 Express 服务器),它们分别位于不同的进程中。在本地端口上运行的 serverTCP 中放置一个单独的 Express 服务器,不对外开放。当 serverAPI 收到某些 socketID 的数据时,它会向 serverTCP 发出 http 请求并发送数据和 socketID。 serverTCP 接收该 http 请求,从该请求中获取 socketID 和数据,然后通过与它有连接的相应套接字将其发送出去。

仅供参考,这通常称为代理,其中您的 API 在某种程度上充当真实套接字连接的代理。 NPM 中也有各种实现实际代理的模块。