node.js - 如何将app.js链接到html页面,以便我应该使用socket.io在浏览器中显示进度条

标签 node.js socket.io

我无法将index.html页面链接到app.js。我正在尝试将进度发送到index.html。但是,我在这里失败了。我该如何克服这个问题?有人可以吗帮帮我...

我的index.html:

<script src="/socket.io/socket.io.js"></script>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="bootstrap.js"></script>
<link rel="stylesheet" type="text/css" href="bootstrap.css" />

<div id="progressbar">
</div>

<script>
  var socket = io('http://localhost:8085');
  socket.on('connect', function(){});
  socket.on('message', function(data){
    $('#progressbar').progressbar({
    maximum: 100,
    step: JSON.parse(data).percent
    });
  });
  socket.on('disconnect', function(){});
</script>

我的app.js:

  var fs = require('fs');
var request = require('request');
var progress = require('request-progress');
var DOWNLOAD_DIR = '/usr/local/';
var file_name = 'googlenew.png' 

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

var app = express ();
var http = require('http').Server(app);
var io = require('socket.io')(http);
http.listen(8085, function(){
    console.log('listening on *:8085');
});

app.get('/', function (req, res) {
  res.sendfile(__dirname + '/index.html');
});

io.on('connection', function (socket) {

  console.log("connected :"+socket.id);  

});


var callback = function(state){
    console.log('received size in bytes', state.received);
    console.log('total size in bytes', state.total);
    console.log('percent', state.percent);
    io.sockets.emit('message', JSON.stringify({size: state.total, received: state.received, percent: state.percent, fileName: file_name}));

} 

progress(request('https://www.google.com/images/srpr/logo3w.png'), {
    throttle:0,   
    delay: 0       
})
.on('progress', callback) 

.pipe(fs.createWriteStream(DOWNLOAD_DIR + file_name))
.on('error', function (err) {
 console.log("error");  
})
.on('close', function (err){
console.log("Download Complete"); 
})

更新了 app.js :

var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var fs = require('fs');
var request = require('request');
var progress = require('request-progress');
var DOWNLOAD_DIR = '/usr/local/';
var file_name = 'googlenew.png' 

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

var app = express();
var server = app.listen(8085, function(){
    console.log('listening on *:8085');
});
var io = require('socket.io')(server);


app.get('/', function (req, res) {
  res.sendfile(__dirname + '/index.html');
});

io.on('connection', function (socket) {

  console.log("connected :"+socket.id);  

});


var callback = function(state){
    console.log('received size in bytes', state.received);
    console.log('total size in bytes', state.total);
    console.log('percent', state.percent);
    io.sockets.emit('message', JSON.stringify({size: state.total, received: state.received, percent: state.percent, fileName: file_name}));

} 

progress(request('https://www.google.com/images/srpr/logo3w.png'), {
    throttle:0,   
    delay: 0       
})
.on('progress', callback) 

.pipe(fs.createWriteStream(DOWNLOAD_DIR + file_name))
.on('error', function (err) {
 console.log("error");  
})
.on('close', function (err){
console.log("Download Complete"); 
})


// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

// uncomment after placing your favicon in /public
//app.use(favicon(__dirname + '/public/favicon.ico'));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', routes);
app.use('/users', users);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
    var err = new Error('Not Found');
    err.status = 404;
    next(err);
});

// error handlers

// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
    app.use(function(err, req, res, next) {
        res.status(err.status || 500);
        res.render('error', {
            message: err.message,
            error: err
        });
    });
}

// production error handler
// no stacktraces leaked to user
app.use(function(err, req, res, next) {
    res.status(err.status || 500);
    res.render('error', {
        message: err.message,
        error: {}
    });
});


module.exports = app;

最佳答案

您没有正确初始化 Express,因此 app 未连接到任何 Web 服务器,因此 app.get() 未处于事件状态。

更改此:

var app = express ();
var http = require('http').Server(app);
var io = require('socket.io')(http);
http.listen(8085, function(){
    console.log('listening on *:8085');
});

对此:

var app = express();
var server = app.listen(8085, function(){
    console.log('listening on *:8085');
});
var io = require('socket.io')(server);

请参阅 ExpressJS doc 中的基本“Hello World”应用程序示例.

而且,您还需要为 jquery.js、bootstrap.js 等创建路由...请记住,node.js 默认情况下不提供任何文件。由于它们是静态文件,您可能需要使用 app.use(express.static(...)) 来提供静态文件。

关于node.js - 如何将app.js链接到html页面,以便我应该使用socket.io在浏览器中显示进度条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33751439/

相关文章:

node.js - Node - 可读流 pipe() 在 for 循环中覆盖以前的流

node.js - 在路由中将 api 和 web 分开

node.js - mocha 应该预料到超时,超时时调用 done()

javascript - Socket IO Swift 客户端发送带有 ACK 的消息

node.js - MongoDB 聚合组过去 7 天的平均评级,其中包含空值

node.js - 如何使用nodejs和mocha模拟另一个lambda函数内的aws lambda函数调用

node.js - Node.js + Express 中的 split() 问题

javascript - NodeJS 和 Socket.IO

java - Socket io 提示 CORS

javascript - 使用 node.js 的 Socket.io 根本没有表达?