node.js - شرح - socket.io-client npm




node.js+إكسبريس 3+socket.io=لا يمكن تعيين رؤوس بعد إرسالها (7)

أي إصدار من إكسبريس تستخدمه؟ تحقق من https://github.com/visionmedia/express/wiki/Migrating-from-2.x-to-3.x أو جرب هذا:

var server = app.listen(8000);
var io = require('socket.io').listen(server);

أنا جديدة لتعلم node.js ويبدو أن واجهت خطأ لا يمكن الحصول على إصلاح.

لها رمز بسيط جدا والمبتدئين لذلك لا ينبغي أن تحتاج الكثير من التفسير، وأكثر من ذلك يعمل بشكل جيد على لوكالهوست، ولكن يكسر على خادم الإنتاج.

App.js

var express = require('express')
  , routes = require('./routes')
  , http = require('http')
  , path = require('path');

var app = express();

app.configure(function(){
  app.set('port', process.env.PORT || 8000);
  app.set('views', __dirname + '/views');
  app.set('view engine', 'jade');
  app.use(express.favicon());
  app.use(express.logger('dev'));
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(app.router);
  app.use(express.static(path.join(__dirname, 'public')));
});

app.configure('development', function(){
  app.use(express.errorHandler());
});

app.get('/', routes.index);

var server = app.listen(8000);
var io = require('socket.io').listen(server);

server.listen(app.get('port'), function(){
  console.log("Express server listening on port " + app.get('port'));
});

وهنا الخطأ اللعين!

http.js:644
    throw new Error('Can\'t set headers after they are sent.');
          ^
Error: Can't set headers after they are sent.
    at ServerResponse.OutgoingMessage.setHeader (http.js:644:11)
    at ServerResponse.res.setHeader (/home1/artalatc/public_html/cloud1/node_modules/express/node_modules/connect/lib/patch.js:59:22)
    at next (/home1/artalatc/public_html/cloud1/node_modules/express/node_modules/connect/lib/proto.js:153:13)
    at Function.app.handle (/home1/artalatc/public_html/cloud1/node_modules/express/node_modules/connect/lib/proto.js:198:3)
    at Server.app (/home1/artalatc/public_html/cloud1/node_modules/express/node_modules/connect/lib/connect.js:66:31)
    at Manager.handleRequest (/home1/artalatc/public_html/cloud1/node_modules/socket.io/lib/manager.js:564:28)
    at Server.<anonymous> (/home1/artalatc/public_html/cloud1/node_modules/socket.io/lib/manager.js:118:10)
    at Server.EventEmitter.emit (events.js:115:20)
    at HTTPParser.parser.onIncoming (http.js:1793:12)
    at HTTPParser.parserOnHeadersComplete [as onHeadersComplete] (http.js:111:23)

يبدو أن المشكلة في var io = require('socket.io').listen(server); لأن تعليق مثل هذا يزيل الخطأ.


ما إصدار العقدة التي تستخدمها؟

كان لي نفس المشكلة عندما كنت تستخدم 0.9.x. أنا خفضت عقدة إلى 0.8.4 ويبدو أن المشكلة قد ذهبت بعيدا.

أفضل تخمين بلدي هو شيء في عقدة تغيرت أن Socket.io لا يتفق مع.


لأي شخص ينتصب في هذه القضية يجب أن تستخدم:

var server = require('http').createServer(app);
var io = require('socket.io').listen(server);
server.listen(8000);

كما لم يعد يعيد نسخة هتب التي يتطلب socket.io. راجع الملف README.md المحدث على https://github.com/learnboost/socket.io لأمثلة 2 و 3 اكسبرس.


يعمل هذا النهج في الإصدار المستقر الحالي 0.8.14:

var express = require('express')
  , app = express()
  , server = app.listen(8000)
  , io = require('socket.io').listen(server);

كان لي نفس القضية بالضبط. وكانت الإصدارات غير المتوافقة من التعبير و socket.io أن يلوم. ترقية لهم للتعبير عن 3.2.4 و socket.io 0.9.14 ويعمل مثل سحر.

أو يمكنك الرجوع إلى socket.io الخاص بك إلى الإصدار السابق، ولكن سيكون لديك لمعرفة أن واحد خارج.


هذا الخطأ يأتي لأن التعبير عن استخدام ذاكرة التخزين المؤقت داخليا يعني لكل طلب بيانات ثانية الحصول على ذاكرة التخزين المؤقت لذلك الرد مرة أخرى مع 304 رمز الحالة حتى استخدام

app.disable('etag');

فإنه يحكي صريحة كل طلب وسائل جديدة مع ستوتسكود 200


تشغيل قائمة npm.mocket.io

تأكد من أنها لا تظهر غير صالحة على النحو التالي،

[email protected] باطلة

نبم إر! إنفاليد: [email protected] c: \ وسرس ....

إذا كنت تحصل على هذا الخطأ، نبم تثبيت socket.io. أيضا التأكد من نفسه مع حزم أخرى.





pug