2016-01-15 2 views
11

मैं एक app.js जो जब कुछ पोस्ट डेटा प्राप्त कर रहे हैं दो घटनाओं को गति प्रदान करने के लिए इस्तेमाल किया जाता है:एक्सप्रेस और WebSocket एक ही पोर्ट पर ध्यान

    एक डेटाबेस
  1. में
  2. सम्मिलित पोस्ट डेटा संदेश भेजें करने के लिए एक WebSocket

यहाँ का उपयोग कर एक ग्राहक app.js (केवल महत्वपूर्ण लाइनों)

var express = require('express'); 
var bodyParser = require('body-parser'); 
var server = require('./server'); 

var app = express(); 
var port = process.env.PORT || 3000; 

app.post('/server', server); 

app.listen(port, function(){ 
    console.log('Slack bot listening'); 
}); 
012 है

और यहाँ server.js (केवल महत्वपूर्ण लाइनों)

var db = require('./DB'); 
var WebSocketServer = require('ws').Server; 

var insertData = function(req, res){ 

    var wss = new WebSocketServer({server: server}); 
    console.log('WebSocketServer created'); 
    wss.on('connection', function(wss){ 
     wss.send(JSON.stringify('Socket open')); 
    }); 
    wss.on('close', function(){ 
     console.log('WebServerSocket has been closed'); 
    }); 
}; 

module.exports = insertData; 

क्या मैं प्राप्त करने के लिए चाहते हैं एक तरह से WebSocketServer स्थापित करने के लिए है कि यह एप्लिकेशन का एक ही बंदरगाह के लिए सुनने है। मैं से सर्वर वर गुजर के बारे में सोचाको server.js लेकिन

  1. app.js मैं इस यह
  2. करने के लिए एक नहीं एक सुंदर तरीका लगता है कि मैं कैसे करने के लिए पता नहीं है यह

आप क्या सोचते हैं?

+0

आपने कुछ लाइनें छोड़ीं। आपने एक्सप्रेस ऐप पर वेबस्केट सर्वर को 'माउंट' नहीं किया था? – Zlatko

+1

ओह, और अपने प्रश्न का उत्तर देने के लिए। यह सामान्य तरीका है, यह सुरुचिपूर्ण क्यों नहीं है? (कुछ) की आवश्यकता होती है; myServer.mount (कुछ); मॉड्यूल किसी अन्य की तरह। – Zlatko

+0

मैंने वास्तव में एक्सप्रेस ऐप पर WebSocketServer नहीं लगाया क्योंकि मुझे नहीं पता कि यह कैसे करें। क्या आप एक उदाहरण प्रदान करने के लिए बहुत दयालु होंगे? सहायता के लिए धन्यवाद! – Mornor

उत्तर

23

आपके कोड और टिप्पणियों के आधार पर, यह एक सुपर सरल उदाहरण है कि यह एक साथ कैसे काम करेगा।

पहले, http-server.js - एक ठेठ एक्सप्रेस अनुप्रयोग, सिवाय इसके कि हम app.listen() साथ सर्वर प्रारंभ नहीं है:

'use strict'; 

let fs = require('fs'); 
let express = require('express'); 
let app = express(); 
let bodyParser = require('body-parser'); 

app.use(bodyParser.json()); 

// Let's create the regular HTTP request and response 
app.get('/', function(req, res) { 

    console.log('Get index'); 
    fs.createReadStream('./index.html') 
    .pipe(res); 
}); 

app.post('/', function(req, res) { 

    let message = req.body.message; 
    console.log('Regular POST message: ', message); 
    return res.json({ 

    answer: 42 
    }); 
}); 

module.exports = app; 
अब

, ws-server.js उदाहरण के लिए, जहां हम एक से WSS सर्वर बनाने नोड देशी http.createServer()। अब, ध्यान दें कि यह वह जगह है जहां हम ऐप आयात करते हैं, और इस देशी http.create सर्वर को उपयोग करने के लिए ऐप उदाहरण दें।

PORT=8080 node ws-server.js साथ अनुप्रयोग शुरू करें:

'use strict'; 

let WSServer = require('ws').Server; 
let server = require('http').createServer(); 
let app = require('./http-server'); 

// Create web socket server on top of a regular http server 
let wss = new WSServer({ 

    server: server 
}); 

// Also mount the app here 
server.on('request', app); 

wss.on('connection', function connection(ws) { 

    ws.on('message', function incoming(message) { 

    console.log(`received: ${message}`); 

    ws.send(JSON.stringify({ 

     answer: 42 
    })); 
    }); 
}); 


server.listen(process.env.PORT, function() { 

    console.log(`http/ws server listening on ${process.env.PORT}`); 
}); 

अंत में, इस नमूना index.html दोनों एक पोस्ट और एक सॉकेट "अनुरोध" बनाने के द्वारा काम करेंगे और प्रतिक्रिया प्रदर्शित:

<html> 
<head> 
    <title>WS example</title> 
</head> 

<body> 
    <h2>Socket message response: </h2> 
    <pre id="response"></pre> 
    <hr/> 
    <h2>POST message response: </h2> 
    <pre id="post-response"></pre> 
    <script> 

    // Extremely simplified here, no error handling or anything 
document.body.onload = function() { 

    'use strict'; 

    // First the socket requesta 
    function socketExample() { 
    console.log('Creating socket'); 
    let socket = new WebSocket('ws://localhost:8080/'); 
    socket.onopen = function() { 

     console.log('Socket open.'); 
     socket.send(JSON.stringify({message: 'What is the meaning of life, the universe and everything?'})); 
     console.log('Message sent.') 
    }; 
    socket.onmessage = function(message) { 

     console.log('Socket server message', message); 
     let data = JSON.parse(message.data); 
     document.getElementById('response').innerHTML = JSON.stringify(data, null, 2); 
    }; 
    } 

    // Now the simple POST demo 
    function postExample() { 

    console.log('Creating regular POST message'); 

    fetch('/', { 
     method: 'post', 
     headers: { 
     "Content-type": "application/json" 
     }, 
     body: JSON.stringify({message: 'What is the meaning of post-life, the universe and everything?'}) 
    }) 
    .then(response => response.json()) 
    .then(function (data) { 

     console.log('POST response:', data); 
     document.getElementById('post-response').innerHTML = JSON.stringify(data, null, 2); 
    }) 
    .catch(function (error) { 
     console.log('Request failed', error); 
    }); 
    } 

    // Call them both; 

    socketExample(); 
    postExample(); 
} 
    </script> 
</body> 
</html> 

नोट आपको एक हालिया ब्राउज़र की आवश्यकता होगी, जिसमें एक क्लाइंट साइड भाग के लिए वेबसॉकेट और लाने वाले एपीआई दोनों हों, लेकिन यह अप्रासंगिक है, फिर भी यह आपको इसकी जानकारी देता है।

+5

वाह @Zlatko, यह एक जवाब का नरक है।आपके लिए लिए गए समय के लिए बहुत बहुत धन्यवाद। बहुत सराहना की! अच्छी तरह से काम। – Mornor

+0

@Zlatko 'ws' के बजाय नोडज 'नेट' का उपयोग करके लगभग बराबर सेट अप नहीं कर सकता है। net.createServer http सर्वर का उदाहरण नहीं लेता है जैसे कि एक नया ws इंस्टेंस करने के लिए - नया WSServer ({server: server}); – DKebler

+0

@DKebler का उत्तर यहां प्रश्न के रूप में 'express.js' और' ws' मॉड्यूल के लिए विशिष्ट था। क्या आप एक्सप्रेस के चारों ओर एक 'नेट' श्रोता लपेटने की कोशिश कर रहे हैं? क्या के लिए, वास्तव में कैसे? क्या आपके पास कोई सवाल है? – Zlatko

संबंधित मुद्दे