Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/442.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
Javascript 如何在Node.js上的控制器或外部文件上使用web套接字?我能';无法访问io对象_Javascript_Node.js_Websocket_Socket.io_Controller - Fatal编程技术网

Javascript 如何在Node.js上的控制器或外部文件上使用web套接字?我能';无法访问io对象

Javascript 如何在Node.js上的控制器或外部文件上使用web套接字?我能';无法访问io对象,javascript,node.js,websocket,socket.io,controller,Javascript,Node.js,Websocket,Socket.io,Controller,对不起,我说的是英语: 我正在尝试创建websocket应用程序,但无法访问控制器中的websocket,无法访问io控制器,只能从index.js访问,但无法从控制器访问: 我将我的申请分为以下几部分: index.js: //Importamos la app const app = require('./app'); const socketIO = require('socket.io'); //Con el modulo 'dotenv' importamos las variab

对不起,我说的是英语:

我正在尝试创建websocket应用程序,但无法访问控制器中的websocket,无法访问io控制器,只能从index.js访问,但无法从控制器访问:

我将我的申请分为以下几部分:

index.js:

//Importamos la app
const app = require('./app');

const socketIO = require('socket.io');

//Con el modulo 'dotenv' importamos las variables de entorno
//contenidas dentro del archivo '.env'
//Se recomienda correr este proyecto con permisos de administrador
require('dotenv').config();

//Importamos la conexion a la base de datos dentro de 'database.js'
require('./database/database');

//Esta funcion ejecuta el servidor
async function main(){

    //Obtenemos el puerto
    const PORT = app.get('port');  

    //Escuchamos el servidor en puerto y con '0.0.0.0' podemos acceder publicamente
    server = await app.listen(PORT, '0.0.0.0');


    const io=socketIO.listen(server);

    //console.log('io index: ', io)

    /*
    io.on('connection', function(){
        console.log('Socket Conectado');
        io.emit('Prueba', 'Hola soy el



servidor'.toString());
});
*/


//Mostramos por consola
console.log('Servidor ejecutandose en el puerto: ', PORT);
};

main();
app.js:

//Importamos 'express'
const express = require('express');

//Importamos 'morgan'
const morgan = require('morgan');

//Creamos una aplicacion
const app = express();

//Importamos 'cors'
const cors = require('cors');

//Importamos 'path' para poder manipular las rutas del sistema
const path = require('path');

//------------------------------------CONFIGURACIONES-----------------------------------

//Definimos el puerto
app.set('port', process.env.PORT || 3000);

//Archivos estaticos
app.use(express.static(path.join(__dirname, 'public')));//Configuramos la ubicacion de la carpeta 'public'

//--------------------------------------MIDDLEWARES-------------------------------------

//Configuramos 'morgan' en modo 'dev' para recibir mensajes de estado del servidor
app.use(morgan('dev'));

//Permitimos que el servidor entienda formato json
app.use(express.json());

//Permitimos la comunicacion con el frontend
app.use(cors()); 

//----------------------------------------RUTAS-----------------------------------------

//Usamos las rutas

//Rutas del servidor
app.use('/server', require('./routes/serverRoutes'));

//Rutas del dispositivo
app.use('/device', require('./routes/deviceRoutes'));

//--------------------------------------------------------------------------------------

//Exportamos el modulo
module.exports = app;
serverRoutes.js:

//Importamos el enrutador desde express
const {Router} = require('express');

//Importamos el 'middleware' 'verifyToken'
const verifyToken = require('../controllers/verifyToken');

//Importamos las funciones del controlador
const {createNewDevice, getDevicesStatus, modifyDeviceData} = require('../controllers/serverControllers');

//Ejecutamos la funcion y creamos un objeto 'router'
const router = Router();

//Creamos la ruta principal '/' para obtener el estado del 'device'
router.get('/', getDevicesStatus);

//Creamos una ruta por medio del metodo 'post' para crear un 'device'
router.post('/createDevice', createNewDevice);

//Creamos una ruta por medio del metodo 'put' para modificar o enviar al 'device'
router.put('/modifyData', verifyToken, modifyDeviceData);

//Exportamos el modulo
module.exports = router;
serverController.js:

//Importamos el modelo de datos desde 'models/deviceModel.js'
const Device = require('../models/deviceModel');

const socketIO = require('socket.io');

const io = socketIO();

//Importamos el modulo de webtokens
//Un 'JSON web token' o 'JWT' es un arreglo de caracteres que sirve para 
//contener las credenciales de acceso y cumple una funcion similar a un password
const jwt = require('jsonwebtoken');

//Importamos las configuraciones para jwt
const config = require('../../jwt_config');

//Almacenamos en un objeto todas las funciones del controlador
const deviceCtrl={};

//Con la notacion a continuacion relacionamos las funciones con el objeto 'notesCtrl'

//Funcion para crear un nuevo 'device'
deviceCtrl.createNewDevice= async(req, res) =>{

    //Recibimos los datos en formato JSON
    const{name}=req.body;

    //Creamos un nuevo 'device'
    const device = new Device({
        name: name,
        token: '0',
        message: 'Dispositivo nuevo creado',
        sensorStatus: '0',
        rgbStatus: '0',
    });

    //Guardamos en la base de datos
    await device.save();

    //Creamos un nuevo 'token'
    //Donde enviamos un dato , en este caso 'user._id' al cliente
    //,usamos 'config.secret', para cifrarlo y con 'expiresIn' definimos el tiempo en 
    //segundos que durara el 'token' hasta su exporacion
    const token = jwt.sign({id : device._id}, 
        //Llamamos el valor 'secret' de 'jwt_config'
        config.secret,
        //En este caso sseria un dia
        //{expiresIn: 60*60*24}
        );

    //Buscamos por 'id' y luego la actualizamos el dato 'token, en realidad
    //NO es necesario guardarlo en la base de datos,
    //esto es solo para poderlo reutilizar para pruebas
    await Device.findByIdAndUpdate(device.id, {token});

    //Cambiamos el parametro 'token' para poderlo ver
    device.token=token;

    console.log(device.message);

    //Mostramos por consola
    console.log(`New device: ${device}`);

    //Enviamos la respuesta al cliente
    res.json({
        message: "New device created",
        token: token 
    });

};

//Funcion para obtener el estado del dispositivo
deviceCtrl.getDevicesStatus = async (req, res) => {

    console.log('io ctr: ', io)

    socket.on('connection', function(){
        console.log('Socket Conectado');
        socket.emit('Prueba', 'Hola soy el servidor'.toString());
    });

    //Hacemos una consulta en todos los datos de la coleccion 'Device
    const deviceStatus = await Device.find();
    //Devolvemos el resultado de la consulta
    res.json(deviceStatus);

};

//Funcion para modificar los datos dentro del dispositivo en este caso solo el LED RGB
deviceCtrl.modifyDeviceData = async(req,res) => {

    //Como podemos acceder a 'req.userId' por medio 'verifyToken.js'
    //lo usamos para hacer la consulta en la base de datos y modificar
    const id = req.userId;

    //Recibimos los datos en formato JSON
    const{ message, rgbStatus}=req.body;

    console.log('id: ', id)

    //Hacemos la consulta en la base de datos
    await Device.findByIdAndUpdate(id, {
        message: message,
        rgbStatus: rgbStatus
    });    

    //Monstamos en consola
    console.log(`Enviando al dispositivo: \n message: ${message}, rgbStatus: ${rgbStatus}`);

    //Devolvemos al cliente
    res.json({
        message: message,
        rgbStatus: rgbStatus
    });

}

//Exportamos el modulo
module.exports = deviceCtrl;
谢谢你的帮助

你的index.js说

  const io = socketIO.listen(server)
您的任务是将名为
io
的数据项放入所需模块的作用域中。实际上,只要
async function main()
返回,它就超出了范围--消失了

节点有一个
全局
对象。因此,您可以将上面的行更改为

  global.io =  socketIO.listen(server)
然后在需要在其他函数中使用它时,提及
global.io

Pro-tip如果你这样做,我建议你给它起一个更具描述性的名字,比如

  global.socketListener =  socketIO.listen(server)
所以你和下一个编写代码的人会记得几年后发生了什么

现在,看,全局变量通常被认为是有害的。所以要小心。

你的index.js说

  const io = socketIO.listen(server)
您的任务是将名为
io
的数据项放入所需模块的作用域中。实际上,只要
async function main()
返回,它就超出了范围--消失了

节点有一个
全局
对象。因此,您可以将上面的行更改为

  global.io =  socketIO.listen(server)
然后在需要在其他函数中使用它时,提及
global.io

Pro-tip如果你这样做,我建议你给它起一个更具描述性的名字,比如

  global.socketListener =  socketIO.listen(server)
所以你和下一个编写代码的人会记得几年后发生了什么


现在,看,全局变量通常被认为是有害的。所以要小心。

谢谢你的回答,我听说不建议使用全局对象,有一个表单可以以模块的形式导出实例化io?我创建了第二个版本,但是,我是stackoverflow的新手,我不知道如何发布新代码。您应该问另一个问题,关于使用某种模块封装套接字侦听器对象的问题。显式声明的全局变量,如
global.socketListener
,与隐式全局变量,如plain
socketListener
,相比,编程实践的肮脏程度要小得多。隐式全局对象使调试变得困难。谢谢你的回答,我的主要问题是封装一个io对象谢谢你的回答,我听说不建议使用全局对象,有一个表单可以以模块的形式导出实例化io?我创建了第二个版本,但是,我是stackoverflow的新手,我不知道如何发布新代码。您应该问另一个问题,关于使用某种模块封装套接字侦听器对象的问题。显式声明的全局变量,如
global.socketListener
,与隐式全局变量,如plain
socketListener
,相比,编程实践的肮脏程度要小得多。隐式全局变量使调试变得困难。谢谢你的回答,我的主要问题是封装一个io对象