همایون رضایی
6 سال پیش توسط همایون رضایی مطرح شد
12 پاسخ

استفاده از سوکت دات آی او در فریم ورک اکسپرس

سلام به همه دوستان و اساتید گرامی

دوستان ؟! من تصمیم دارم از Socket.io در فریم ورک Express استفاده کنم. من نمونه کدی که داکیومنت وب سایت Socket.io برای ایجاد یک پروژه چت بیان کرده است را با موفقیت اجرا کرده ام. لینک زیر:
https://socket.io/get-started/chat

اما مشکل زمانی به وجود می آید که بخواهیم از Express Generator برای استفاده از Socket.io استفاده کنیم. در این حالت اصلا Socket.io کار نمی کند. حداقل اینکه من نتونستم خروجی رو دریافت کنم. ظاهرا کمی باید متفاوت عمل کرد. من موفق شدم منبعی برای رفع این مشکل پیدا کنم :
https://onedesigncompany.com/news/express-generator-and-socket-io
اما باز هم طبق آموزشی که در لینک فوق وجود دارد من نتونستم جوابی دریافت کنم.

دوستان ! اگر کسی تونسته این مشکل را حل کند ممنون میشم بنده رو نیز راهنمایی کنید.
پیشاپیش از همه ی دوستانی که در این بحث مشارکت می کنند تشکر می کنم.


ثبت پرسش جدید
vahid Mohammadi
@viva.mohammadi 6 سال پیش مطرح شد
1

کدتون رو بزارین و در مورد مشکل پیش اومده بیشتر توضیح بدین
@raeisialireza110


همایون رضایی
@raeisialireza110 6 سال پیش مطرح شد
0

کد رو می تونید از آدرس زیر در گیت هاب دانلود کنید :
https://github.com/onedesign/express-socketio-tutorial

مشکل دقیقا اینه که وقتی کد فوق رو نصب می کنم و اجرا می کنم نتیجه ای دریافت نمی کنم !
طبق توضیحاتی که در آدرس فوق بیان شده باید کلمه ی users در console.log نمایش داده شود. اما این اتفاق نمی افتد.

من توی اینترنت برای یافتن پاسخ این مشکل خیلی سرچ کردم اما جواب درستی دریافت نکرده ام. کلا اجرای Socket.IO در Express Generator قلق خاصی داره. من این رو نمی دونم.

اما اجرای Socket.io بر روی node.js خیلی راحته. یعنی وقتی از Express به شکل معمولی استفاده می کنیم یعنی به کمک Generator فایل ها و پوشه های Express رو ایجاد نکنیم خیلی راحت Socket.io اجرا میشه و نتیجه میده. اما اگر با Generator این کار رو انجام داده باشیم با خطاهای زیادی روبرو میشیم.

از دوستان عزیزم خواهشمندم اگر راه حلی برای رفع این مشکل می دونید به اشتراک بگذارید ...


vahid Mohammadi
@viva.mohammadi 6 سال پیش مطرح شد
1

من تست کردم ، مشکلی نبود و کلمه users در کنسول نشون داده شد.
شما وقتی کد زیر را اجرا کردین

node bin/www

یک ترمینال ویندوی جدید باز کنید و دستور زیر را وارد کنید و کنسول رو نکاه کنید

 curl http://localhost:3000/users

اگر مشکلتون حل نشد بفرمایید کل پروژه رو براتون بفرستم
@raeisialireza110


همایون رضایی
@raeisialireza110 6 سال پیش مطرح شد
0

آقا وحید ممنونم از راهنمایی تون.

اما من دقیقا کارهایی که گفتید رو انجام دادم اما نتیجه دریافت نکردم.
ممنون میشم کل پروژه رو برام بفرستید ...

ببنید من پروژه را از آدرس :
https://github.com/onedesign/express-socketio-tutorial
دانلود کردم و بدون اینکه تغییری اعمال کنم پروژه رو اجرا کردم اما جوابی نمی گیرم. از صفحاتم عکس گرفتم در آدرس زیر قرار دادم ...
http://s8.picofile.com/file/8337208668/socket.zip.html

اما users نمایش داده نمیشه ...

ممنون میشم راهنمایی کنید.
با تشکر ...

@viva.mohammadi


vahid Mohammadi
@viva.mohammadi 6 سال پیش مطرح شد
1

@raeisialireza110
سلام خواهش میکنم
خوب یکسری تغییرات باید اعمال کنید تا اجرا بشه، من فایل هایی که باید تغییر بدین رو در زیر میارم دقیقا کپی پیست کنید و اجرا کنید.
فایل app.js  

var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');

var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');

var app = express();
var server = require('http').Server(app);
var io = require('socket.io')(server);
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use(function(req, res, next){
  res.io = io;
  next();
});
app.use('/', indexRouter);
app.use('/users', usersRouter);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  next(createError(404));
});

// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error', {
    message: err.message,
    error: {}
  });
});

module.exports = {app: app, server: server};

فایل users.js در زیرشاخه routes

var express = require('express');
var router = express.Router();

/* GET users listing. */
router.get('/', function(req, res, next) {
  res.io.emit("socketToMe", "users");
  res.send('respond with a resource.');
});

module.exports = router;

فایل index.js در زیرشاخه routes

var express = require('express');
var router = express.Router();

/* GET home page. */
router.get('/', function(req, res, next) {
  res.render('index', { title: 'Express' });
});

module.exports = router;

فایل bin\www

#!/usr/bin/env node

/**
 * Module dependencies.
 */

var app = require('../app').app;
var debug = require('debug')('www:server');
var http = require('http');

/**
 * Get port from environment and store in Express.
 */

var port = normalizePort(process.env.PORT || '3000');
app.set('port', port);

/**
 * Create HTTP server.
 */

var server = require('../app').server;

/**
 * Listen on provided port, on all network interfaces.
 */

server.listen(port);
server.on('error', onError);
server.on('listening', onListening);

/**
 * Normalize a port into a number, string, or false.
 */

function normalizePort(val) {
  var port = parseInt(val, 10);

  if (isNaN(port)) {
    // named pipe
    return val;
  }

  if (port >= 0) {
    // port number
    return port;
  }

  return false;
}

/**
 * Event listener for HTTP server "error" event.
 */

function onError(error) {
  if (error.syscall !== 'listen') {
    throw error;
  }

  var bind = typeof port === 'string'
    ? 'Pipe ' + port
    : 'Port ' + port;

  // handle specific listen errors with friendly messages
  switch (error.code) {
    case 'EACCES':
      console.error(bind + ' requires elevated privileges');
      process.exit(1);
      break;
    case 'EADDRINUSE':
      console.error(bind + ' is already in use');
      process.exit(1);
      break;
    default:
      throw error;
  }
}

/**
 * Event listener for HTTP server "listening" event.
 */

function onListening() {
  var addr = server.address();
  var bind = typeof addr === 'string'
    ? 'pipe ' + addr
    : 'port ' + addr.port;
  debug('Listening on ' + bind);
}

همایون رضایی
@raeisialireza110 6 سال پیش آپدیت شد
0

آقا وحید من کدهای فوق رو جایگزین کردم اما با خطای زیر روبرو شدم ...

E:demo>node bin/www
E:demo
ode_modulesexpresslibexpress.js:99
      throw new Error('Most middleware (like ' + name + ') is no longer bundled with Express and must be installed separately. Please see https://github.com/senchalabs/connect#middleware.');
      ^

Error: Most middleware (like json) is no longer bundled with Express and must be installed separately. Please see https://github.com/senchalabs/connect#middleware.
    at Function.get (E:demo
ode_modulesexpresslibexpress.js:99:13)
    at Object.<anonymous> (E:demoapp.js:18:17)
    at Module._compile (internal/modules/cjs/loader.js:702:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:713:10)
    at Module.load (internal/modules/cjs/loader.js:612:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:551:12)
    at Function.Module._load (internal/modules/cjs/loader.js:543:3)
    at Module.require (internal/modules/cjs/loader.js:650:17)
    at require (internal/modules/cjs/helpers.js:20:18)
    at Object.<anonymous> (E:demoinwww:7:11)

این خطا مربوط به چه قسمتی میشه ؟

با تشکر از شما

@viva.mohammadi


vahid Mohammadi
@viva.mohammadi 6 سال پیش مطرح شد
0

@raeisialireza110
شما فرمان زیر رو در مسیری که نوشتم اجرا کنید بعدش تست بگیرید و نتیجه رو بفرمایید

E:\demo\npm i

همایون رضایی
@raeisialireza110 6 سال پیش مطرح شد
0

دستور رو نوشتم باز همون ارور رو میده .

پروژه ای که در حال اجرای اون هستم رو در لینک زیر قرار دادم . ممنون میشم دانلود کنید و بررسی کنید که آیا برای شما پاسخ میده یا نه !!!

http://s9.picofile.com/file/8337230684/demo.rar.html

@viva.mohammadi


vahid Mohammadi
@viva.mohammadi 6 سال پیش مطرح شد
0

@raeisialireza110
بله مشکل رو دیدم دلیل خطا برای قدیمی بودن پکیجهاتون بود اما راهکار :
۱ - کدهای زیر رو به جای کدهای فعلیتون در فایل Package.json پیست کنید

{
  "name": "testexpressapp",
  "version": "0.0.0",
  "private": true,
  "scripts": {
    "start": "node ./bin/www"
  },
  "dependencies": {
    "cookie-parser": "~1.4.3",
    "debug": "~2.6.9",
    "express": "~4.16.0",
    "http-errors": "~1.6.2",
    "jade": "~1.11.0",
    "morgan": "~1.9.0",
    "socket.io": "^2.1.1"
  }
}

۲ - فولدر node_modules را پاک کنید
۳- دستور زیر را اجرا بفرمایید.

npm i

باز هم اگه مشکلی بود در خدمتم


همایون رضایی
@raeisialireza110 6 سال پیش مطرح شد
0

سلام مجدد به همه دوستان و به ویژه آقا وحید

تشکر فراوان از آقا وحید بابت صبر و شکیبایی شون برای پاسخ به سوالات

آقا وحید خطا برطرف شد اما جواب مورد نظر که همه کلمه users باشه رو من باز دریافت نکردم.
بنده مجددا کل فایل های پروژه و عکسی از نتیجه ی اجرای ترمینال ها رو ضمیمه کردم.

ممنون میشم لطف کنید و بررسی شون کنید.
با تشکر

فایل های پروژه :
http://s8.picofile.com/file/8337342700/demo.rar.html

تصویر نتیجه اجرای ترمینال ها :
http://s8.picofile.com/file/8337342876/result_img.png

@viva.mohammadi


vahid Mohammadi
@viva.mohammadi 6 سال پیش مطرح شد
0

@raeisialireza110

ممنون از لطف شما
برادر جان کدهای شما داره درست کار میکنه اما شما کلمه users رو قرار نیست توی ترمینال ببینی شما باید با مرورگرت آدرس زیر را باز کنی

http://localhost:3000

و رایت کلیک کنی و گزینه ‌Inspect رو بزنی بعدش به تب Console بری و در اونجا کلمه users رو بیبینی البته هر بار که دستور زیر رو اجرا کنی

 curl http://localhost:3000/users

همایون رضایی
@raeisialireza110 6 سال پیش آپدیت شد
0

آقا وحید واقعا ممنونم . بله جواب گرفتم.

سوال دیگه ای هم داشتم ممنون میشم که در این مورد نیز راهنمایی کنید.
من قصد دارم پروژه ی چت رومی که در سایت Socket.IO هست رو با اکسپرس اجر کنم. در حقیقت اسکریپت بالا رو برای همین می خواستم که بتونم این کار رو انجام بدم.
داکیومنت Socket.IO :
https://github.com/socketio/chat-example
دانلود پروژه موجود در داکیومنت فوق در گیت هاب :
https://github.com/socketio/chat-example

من وقتی پروژه چت روم رو بدون Express Generator تست می کنم جواب می گیریم. اما با Express Generator جواب نمی گیرم.
تغییراتی که در بالا فرمودید رو هم اعمال کردم اما همچنان این چت روم کار نمی کنه.

روش اجرای پروژه فوق در Express Generator :
من توسط دستور :

node bin/www

پروژه را اجرا می کنم و دو تب در مرورگر باز می کنم و آدرس زیر رو در آن ها وارد می کنم :

http://localhost:3000

در هر دو تب فرم چت روم ظاهر میشه اما وقتی در فیلد متنی رو تایپ می کنم در هیچ از دو تب نمایش داده نمیشه.
انتظار میره که مطابق ویدئویی که در زیر لینک آن را قرار داده ام کار کنه اما کار نمی کنه :

https://i.cloudup.com/transcoded/J4xwRU9DRn.mp4

لینک دانلود پروژه ی فوق که در حال کار کردن بر روی آن هستم :

http://s8.picofile.com/file/8337514034/chat.rar.html

@viva.mohammadi


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام