angularjs - 无法从 API 请求向控制器发送数据
问题描述
我正在尝试从谷歌驱动器获取用户表单的列表。这是下面的代码(我的 API 中的 GET 请求):
router.get("/googleToken", function (req, res) {
// Function to retrieve forms after AUTH
function listFiles(auth) {
const drive = google.drive({version: 'v3', auth});
drive.files.list({
q: "mimeType='application/vnd.google-apps.form'",
fields: 'nextPageToken, files(id, name)',
}, (err, res) => {
if (err) return console.log('The API returned an error: ' + err);
var files = res.data.files;
// Callback function to return files
function callback() { return files; };
if (files.length) {
// CALL callback to return data
callback();
} else {
console.log('No files found.');
}
});
}
var code = req.query.code;
oauth2Client.getToken(code, function (err, tokens) {
if (err) {
console.log(err);
res.send(err);
return;
}
else {
oauth2Client.setCredentials(tokens);
var forms = listFiles(oauth2Client);
res.send(forms);
}
});
});
问题是在设置凭据后,我试图通过访问所有表单的 listFiles 函数将数据发送到我的控制器(AngularJS),但是它没有发送任何响应。任何帮助或提示表示赞赏。在此先感谢。
解决方案
您需要了解异步编程,您需要使用callback
或Promise
只是res.send()
在函数内调用listFiles
函数,以下示例可能会对您有所帮助
router.get("/googleToken", function (req, res) {
// Function to retrieve forms after AUTH
function listFiles(auth) {
const drive = google.drive({
version: 'v3',
auth
});
drive.files.list({
q: "mimeType='application/vnd.google-apps.form'",
fields: 'nextPageToken, files(id, name)',
}, (err, res) => {
if (err) {
console.log('The API returned an error: ' + err);
return res.status(500).send(err);
}
var files = res.data.files;
if (files.length) {
return res.send(files);
} else {
console.log('No files found.');
return res.status(400).send({message: 'No files found.'});
}
});
}
var code = req.query.code;
oauth2Client.getToken(code, function (err, tokens) {
if (err) {
console.log(err);
return res.send(err);
} else {
oauth2Client.setCredentials(tokens);
listFiles(oauth2Client);
}
});
});
以下示例使用Promise
router.get("/googleToken", function (req, res) {
// Function to retrieve forms after AUTH
function listFiles(auth) {
return new Promise(function (resolve, reject) {
const drive = google.drive({
version: 'v3',
auth
});
drive.files.list({
q: "mimeType='application/vnd.google-apps.form'",
fields: 'nextPageToken, files(id, name)',
}, (err, res) => {
if (err) {
console.log('The API returned an error: ' + err);
return reject(err);
}
var files = res.data.files;
if (files.length) {
return resolve(files);
} else {
console.log('No files found.');
return reject({message: 'No files found.'});
}
});
});
}
var code = req.query.code;
oauth2Client.getToken(code, function (err, tokens) {
if (err) {
console.log(err);
return res.send(err);
} else {
oauth2Client.setCredentials(tokens);
listFiles(oauth2Client)
.then( function(files) {
res.send(files);
})
.catch( function(err) {
console.log(err);
res.send(err);
});
}
});
});
推荐阅读
- c# - 齐次线性方程组的基本解:Ax=0,Det(A)=0,MathNet
- bash - sudo pm2 log|app2 命令后 Bash 没有响应,只能输入
- flutter - 我有电话号码,我想显示前三个号码和后两个号码,比如 700XXXXX20 像这样?
- php - Codeigniter - 用于登录的验证码不起作用
- javascript - 在 Node.js 后端使用 multer 和 AJAX 获取视频文件
- php - 网页刷新后如何保持我的位置
- android-adapter - 如何防止在滚动我的回收站视图时创建重复项
- android - 如何在 Nativescript 中使用 startActivityForResult
- matlab - matlab定点迭代在定点稳定后跳到零
- php - Facebook API:广告线索的空结果