Decidí hacer un tipo de sitio de chat janky para comenzar a trabajar con solicitudes y demás.
Mi enfoque fue crear un servidor express.js que reciba solicitudes cuando se publique '/messageReciever'.
app.post("/messageReciever", (req, res) => { logMessage(req.body.message); });El siguiente paso fue crear un 'cliente' que pudiera enviar información a este punto final:
var XMLHttpRequest = require("XMLHttpRequest").XMLHttpRequest; function makePostRequest(url, json) { let http = new XMLHttpRequest(); http.open("POST", url, true); http.setRequestHeader("Content-Type", "application/json"); http.send(JSON.stringify(json)); } function sendMessage(url, message) { makePostRequest(url, {message: message}); logMessage(message); }Ambos están bien. El problema con el que me encuentro es que, una vez que recibo la solicitud de publicación, quiero actualizar la página principal de mi sitio (para mostrar los mensajes)
app.get('/', (req, res) => { res.render('index', data = retrieveMessages()); });He intentado básicamente todo lo que he encontrado en línea:
res.redirect('back'); res.redirect(req.get('referer')); res.redirect(req.originalUrl) res.redirect('back') anteriormente en mi código, y funciona. El problema es que intento actualizar la conexión de alguien a un sitio en función de la conexión de otra persona; lo que significa que no puedo usar la información de respuesta como lo haría normalmente.
He intentado buscar formas de actualizar páginas desde funciones externas, pero no puedo encontrar nada.
( Me doy cuenta de que hay formas más fáciles de hacer un sitio de chat que no incluyen el envío extraño de datos entre dos servidores )
Puede usar un paquete llamado socket.io . Socket.io le permite enviar solicitudes a un cliente una vez que el servidor tiene algunos datos.
Servidor:
// Define express const express = require('express'); const app = express(); // Create the server const http = require('http'); const server = http.createServer(app); // Define socket.io const io = require('socket.io')(server); // Define the port for the server to listen on let port = 3000; function logMessage(message, id) { ... io.emit('message_sent_' + id, { message }); // Emit that a message was sent to the clients } function recieveMessages(id) { // Get the messages somehow } app.post('/messageReciever', (req, res) => { // req.body.message is your message and req.cookies.id is the clients random ID logMessage(req.body.message, req.cookies.id); }); app.get('/', (req, res) => { res.cookie('id', 'some-generated-id'); // Set a cookie for the unique ID to fetch user messages res.render('index', { data: retrieveMessages() }); }); // Get the server listening to incoming requests server.listen(port, () => console.log('my app is online');Cliente:
<!doctype html> <html> <body> ... </body> <script src="/socket.io/socket.io.js"></script> <script> const socket = io.connect(); socket.on('message_sent_' + 'some-id', function(data) { // Do something with the data }); </script> </html>Referencias: