Javascript 如何在Node.js上的控制器或外部文件上使用web套接字?我能';无法访问io对象
对不起,我说的是英语: 我正在尝试创建websocket应用程序,但无法访问控制器中的websocket,无法访问io控制器,只能从index.js访问,但无法从控制器访问: 我将我的申请分为以下几部分: index.js: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
//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
,与隐式全局变量,如plainsocketListener
,相比,编程实践的肮脏程度要小得多。隐式全局对象使调试变得困难。谢谢你的回答,我的主要问题是封装一个io对象谢谢你的回答,我听说不建议使用全局对象,有一个表单可以以模块的形式导出实例化io?我创建了第二个版本,但是,我是stackoverflow的新手,我不知道如何发布新代码。您应该问另一个问题,关于使用某种模块封装套接字侦听器对象的问题。显式声明的全局变量,如global.socketListener
,与隐式全局变量,如plainsocketListener
,相比,编程实践的肮脏程度要小得多。隐式全局变量使调试变得困难。谢谢你的回答,我的主要问题是封装一个io对象