【发布时间】:2017-05-15 21:11:43
【问题描述】:
我编写了一个名为 deploy.js 的文件,它通过其 API 将文件夹中的所有文件上传到 github。它需要两个参数 - 用户的 accessToken 和您要上传的文件夹。我通过passport-github获取访问令牌。我有一个主 app.js 文件,并且 deploy.js 可通过变量 deploy 获得。 App.js 有一个路由/what 调用部署函数。问题是下面的代码有效。
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");
});
});
但如果我将res.send() 放在回调之外,它不会完全执行。
app.get('/what', function(req, res) {
deploy(req.user.token, folder, function() {
console.log("deploy completed");
});
res.send("Work being done");
})
这是我编写的 deploy.js 文件。我使用 npm-github 库作为原生 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();
});
});
};
我把头撞在墙上寻找原因,但我找不到任何原因。这可能与关闭有关,但我不太确定。如果有人能提供帮助,我将不胜感激。谢谢。
【问题讨论】:
-
因为
node.js是异步的。 -
这是一个
I/O,应该是async,你must在deploy函数中发送你的回复。您可以查看here 了解更多信息。 -
我知道,但我不明白你在指出什么。在第一种情况下,它运行良好。在第二种情况下,它最初运行,然后在某个点挂起。即使在 res.send() 之后,部署函数应该继续运行吗?请有人纠正我。
-
@SaeidAlidadi 部署功能需要相当长的时间来完成它的工作。在这段时间内,如果我们不发送响应,请求就会超时。这会导致一种荒谬的行为(例如快速重新请求同一路线),从而导致一些问题。有什么方法可以通过及时发送响应来运行它?谢谢。
标签: javascript node.js express github github-api