NodeJS 是 运行 一个脚本到另一个脚本

NodeJS is running one script into another one

我创建了一个 TCP 服务器用于从一些设备接收信息,我想从这个服务器创建一个 API out,我导出了两个变量以便在 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

好吧socketnodejs中的对象属于一个特定的进程。您不能轻易地与另一个进程共享它们。如果您希望一个进程导致数据在另一个进程拥有的套接字上发送,则使用不同的服务器将数据本身发送到另一个进程,并发送一些标识符和接收进程可以用来确定哪个套接字的数据数据应该被发送到,然后它将通过它拥有的套接字发送数据。但是,这整件事听起来确实是一种令人困惑的做事方式。

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

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