سلام به همه دوستان و اساتید گرامی
دوستان ؟! من تصمیم دارم از 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
اما باز هم طبق آموزشی که در لینک فوق وجود دارد من نتونستم جوابی دریافت کنم.
دوستان ! اگر کسی تونسته این مشکل را حل کند ممنون میشم بنده رو نیز راهنمایی کنید.
پیشاپیش از همه ی دوستانی که در این بحث مشارکت می کنند تشکر می کنم.
کد رو می تونید از آدرس زیر در گیت هاب دانلود کنید :
https://github.com/onedesign/express-socketio-tutorial
مشکل دقیقا اینه که وقتی کد فوق رو نصب می کنم و اجرا می کنم نتیجه ای دریافت نمی کنم !
طبق توضیحاتی که در آدرس فوق بیان شده باید کلمه ی users در console.log نمایش داده شود. اما این اتفاق نمی افتد.
من توی اینترنت برای یافتن پاسخ این مشکل خیلی سرچ کردم اما جواب درستی دریافت نکرده ام. کلا اجرای Socket.IO در Express Generator قلق خاصی داره. من این رو نمی دونم.
اما اجرای Socket.io بر روی node.js خیلی راحته. یعنی وقتی از Express به شکل معمولی استفاده می کنیم یعنی به کمک Generator فایل ها و پوشه های Express رو ایجاد نکنیم خیلی راحت Socket.io اجرا میشه و نتیجه میده. اما اگر با Generator این کار رو انجام داده باشیم با خطاهای زیادی روبرو میشیم.
از دوستان عزیزم خواهشمندم اگر راه حلی برای رفع این مشکل می دونید به اشتراک بگذارید ...
من تست کردم ، مشکلی نبود و کلمه users در کنسول نشون داده شد.
شما وقتی کد زیر را اجرا کردین
node bin/www
یک ترمینال ویندوی جدید باز کنید و دستور زیر را وارد کنید و کنسول رو نکاه کنید
curl http://localhost:3000/users
اگر مشکلتون حل نشد بفرمایید کل پروژه رو براتون بفرستم
@raeisialireza110
آقا وحید ممنونم از راهنمایی تون.
اما من دقیقا کارهایی که گفتید رو انجام دادم اما نتیجه دریافت نکردم.
ممنون میشم کل پروژه رو برام بفرستید ...
ببنید من پروژه را از آدرس :
https://github.com/onedesign/express-socketio-tutorial
دانلود کردم و بدون اینکه تغییری اعمال کنم پروژه رو اجرا کردم اما جوابی نمی گیرم. از صفحاتم عکس گرفتم در آدرس زیر قرار دادم ...
http://s8.picofile.com/file/8337208668/socket.zip.html
اما users نمایش داده نمیشه ...
ممنون میشم راهنمایی کنید.
با تشکر ...
@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);
}
آقا وحید من کدهای فوق رو جایگزین کردم اما با خطای زیر روبرو شدم ...
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)
این خطا مربوط به چه قسمتی میشه ؟
با تشکر از شما
@raeisialireza110
شما فرمان زیر رو در مسیری که نوشتم اجرا کنید بعدش تست بگیرید و نتیجه رو بفرمایید
E:\demo\npm i
دستور رو نوشتم باز همون ارور رو میده .
پروژه ای که در حال اجرای اون هستم رو در لینک زیر قرار دادم . ممنون میشم دانلود کنید و بررسی کنید که آیا برای شما پاسخ میده یا نه !!!
@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
باز هم اگه مشکلی بود در خدمتم
سلام مجدد به همه دوستان و به ویژه آقا وحید
تشکر فراوان از آقا وحید بابت صبر و شکیبایی شون برای پاسخ به سوالات
آقا وحید خطا برطرف شد اما جواب مورد نظر که همه کلمه users باشه رو من باز دریافت نکردم.
بنده مجددا کل فایل های پروژه و عکسی از نتیجه ی اجرای ترمینال ها رو ضمیمه کردم.
ممنون میشم لطف کنید و بررسی شون کنید.
با تشکر
فایل های پروژه :
http://s8.picofile.com/file/8337342700/demo.rar.html
تصویر نتیجه اجرای ترمینال ها :
http://s8.picofile.com/file/8337342876/result_img.png
ممنون از لطف شما
برادر جان کدهای شما داره درست کار میکنه اما شما کلمه users رو قرار نیست توی ترمینال ببینی شما باید با مرورگرت آدرس زیر را باز کنی
http://localhost:3000
و رایت کلیک کنی و گزینه Inspect رو بزنی بعدش به تب Console بری و در اونجا کلمه users رو بیبینی البته هر بار که دستور زیر رو اجرا کنی
curl http://localhost:3000/users
آقا وحید واقعا ممنونم . بله جواب گرفتم.
سوال دیگه ای هم داشتم ممنون میشم که در این مورد نیز راهنمایی کنید.
من قصد دارم پروژه ی چت رومی که در سایت 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
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟