La function Async no se ejecuta correctamente después de enviar la respuesta

Escribí un file llamado deploy.js que carga todos los files de una carpeta en github a través de su API. Se necesitan dos arguments: accessToken del usuario y la carpeta que desea cargar. Obtengo el token de acceso a través de pasaporte-github. Tengo un file principal app.js y deploy.js está disponible para la implementación de la variable. App.js tiene una ruta /what llama a la function de deployment. El problema es que el siguiente código funciona.

 app.get('/what', function(req, res) { //req.user.token contains the oauth token of the user deploy(req.user.token, folder, function() { res.send("completed"); }); }); 

Pero si pongo res.send() fuera de la callback, no se ejecuta por completo.

 app.get('/what', function(req, res) { deploy(req.user.token, folder, function() { console.log("deploy completed"); }); res.send("Work being done"); }) 

Aquí está mi file deploy.js que escribí. He utilizado la biblioteca npm-github como un envoltorio de nodo alnetworkingedor de la github API. nativa github API.

 var distHelper = require('./dist.js'); var fs = require('fs'); var path = require('path'); var github = require('github'); var gh = new github(); module.exports = function(accessToken, folder, callback) { //Authenticating using the oauth accessToken received above gh.authenticate({ type:"oauth", token: accessToken}); var fullPath = distHelper.distPath + "/" + folder; var eventName = folder.substr(folder.search("/") + 1); //the below function returns a list of all files in a directory recursively var walk = function(dir, done) { var results = []; fs.readdir(dir, function(err, list) { if (err) return done(err); var i = 0; (function next() { var file = list[i++]; if (!file) return done(null, results); file = dir + '/' + file; fs.stat(file, function(err, stat) { if (stat && stat.isDirectory()) { walk(file, function(err, res) { results = results.concat(res); next(); }); } else { results.push(file); next(); } }); })(); }); }; //creating a repo gh.repos.create({name: 'b', auto_init: 1}, function(err, response) { if(err) { console.log(err); } walk(fullPath, function(err, results) { if(err) { console.log(err); } //Base64 encoding of a file function encode(file) { var bitmap = fs.readFileSync(file); return new Buffer(bitmap).toString('base64'); } //Function which uploads file to the github one by one function doOne() { var elem = results.shift(); var fileName = elem.substr(elem.search(eventName)+eventName.length + 1); console.log(fileName); gh.repos.createFile({owner: "princu7", repo: "b", path: fileName, message: "please work", content:encode(elem)}, function(err, res) { if(err) { console.log(err); } else { console.log("got response"); } if(results.length > 0) { doOne(); } else { // when all files are finished uploading, then the below function is called callback(); } }); } doOne(); }); }); }; 

Me golpeé la cabeza contra la panetworking buscando las razones pero no he podido encontrar ninguna. Puede ser algo relacionado con los cierres, pero no estoy muy seguro. Realmente apreciaría si alguien ayudara. Gracias.

Debe usar websocket como abajo:

  1. En tu server app.js
 var app = require('express')(); var http = require('http').Server(app); var io = require('socket.io')(http); app.get('/', function(req, res){ res.sendFile(__dirname + '/index.html'); }); io.on('connection', function(socket){ socket.on('doplyment', (msg) => { socket.emit('deploying', 'I will notify you after deployment'); setTimeout(function(){ socket.emit('doployed', 'your request done.') }, 3000) }); }); http.listen(3000, function(){ console.log('listening on *:3000'); });