Я разрабатываю API в NodeJS, чтобы показывать фиды в социальных сетях на моей собственной странице.
Я могу показать Facebook, Twitter и Instagram (через Facebook Graph API), но последний не отображается и возвращает ошибку:
sdk.js: 122
Uncaught TypeError: Невозможно прочитать свойство 'id' из неопределенного
в: 19: 55
в .__ обертке .a .__ обертке (sdk.js: 122)
при F (sdk.js: 139)
на Object.b.onload (sdk.js: 134)
на sdk.js: 134
в sdk.js: 50
at XMLHttpRequest.c.onreadystatechange (sdk.js: 134)
Это происходит только тогда, когда я добавляю изображение на страницу. Поскольку обработка изображений немного особенная, я считаю, что существует конфликт URL между Facebook SDK и моим get paths
в узле.
Мой код:
const express = require('express');
const https = require('https');
const fs = require('fs');
const app = express();
const config = require('./config');
var webId;
var options = {
key: fs.readFileSync(config.paths.certificate.key),
cert: fs.readFileSync(config.paths.certificate.crt),
requestCert: false,
rejectUnauthorized: false
};
app.use(function (req, res, next) {
console.log(req.url);
res.setHeader("Access-Control-Allow-Origin", "*");
res.setHeader("Access-Control-Allow-Credentials", "true");
res.setHeader("Access-Control-Allow-Methods", "GET, HEAD, OPTIONS, POST, PUT");
res.setHeader("Access-Control-Allow-Headers", "Accept, Access-Control-Allow-Headers, Access-Control-Request-Headers, Access-Control-Request-Method, Authorization, Content-Type, Origin, X-Requested-With");
next();
});
/**
* HTTP GET for skip favicon request
*/
app.get('/favicon.ico', function(req, res) {
res.status(404).send('No favicon found');
});
/**
* HTTP GET for views from base path
*/
app.get(/^(\/\w+.\b(html|htm|xhtml)\b)/g, function(req, res) {
let lastBar = req.url.lastIndexOf('/');
let page = req.url.substr(lastBar);
res.sendFile(page, {root: config.paths.webs + webId});
});
/**
* HTTP GET for resources (images)
*/
app.get(/^(\/\b(web_resources)\b)/g, function(req, res) {
if (typeof(webId) === undefined) {
webId = req.params.id;
}
res.sendFile(req.url, {root: config.paths.resources});
});
/**
* HTTP GET for files (.js, .css, etc.) from another folder level
*/
app.get('/:folder/:file', function(req, res) {
if (typeof(webId) === undefined) {
webId = req.params.id;
}
let folder = req.params.folder;
let file = req.params.file;
res.sendFile(file, {root: config.paths.webs + webId + '/' + folder});
});
/**
* HTTP GET for .js files from the base path
*/
app.get(/\/\w+.\b(js)/, function(req, res) {
let lastBar = req.url.lastIndexOf('/');
let script = req.url.substr(lastBar);
res.sendFile(script, {root: config.paths.webs});
});
/**
* HTTP GET for index page
*/
app.get('/:id', function(req, res) {
webId = req.params.id;
res.sendFile('index.html', {root: config.paths.webs + webId});
});
/**
* Server creation listening at secure port 443
*/
https.createServer(options, app).listen(443, function() {
console.clear();
console.log("NodeJS secure server started at port 443");
});
UPDATE
Я мог бы свести проблему к точному куску кода:
FB.getLoginStatus(function (response) {
if (response.status === "connected") {
FB.api(
"/" + id + "/",
"GET", { "fields": "instagram_business_account" },
// ***** THE PROBLEM IS HERE ***** //
function (response) {
if (response.error && response.error !== '') {
console.log("Error recovering 'instagram_business_account':");
console.log(response.error);
} else {
FB.api(
"/" + response.instagram_business_account.id + "/media",
"GET", { "fields": "shortcode" },
function (response) {
for (var i = 0; i < response.data.length; i++) {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
html = JSON.parse(this.response).html.replace('<script async defer src="//www.instagram.com/embed.js"></script>', '');
document.getElementById("ig-posts").innerHTML += html;
}
};
xhttp.open("GET", "https://api.instagram.com/oembed/?url=http://instagr.am/p/" + response.data[i].shortcode + "/", true);
xhttp.send();
}
}
);
}
}
);
} else {
console.log("Error recovering access token: Not connected.")
console.log(response)
}
});
Как я указал в коде, проблема в том, что я не могу получить 'instagram_business_account', потому что:
(# 10) Чтобы использовать «Доступ к общедоступному контенту страницы», вы используете эту конечную точку
должен быть рассмотрен и одобрен Facebook. Чтобы отправить эту страницу публично
Доступ к контенту »для ознакомления, пожалуйста, прочитайте нашу документацию на
Возможности просмотра: https://developers.facebook.com/docs/apps/review
Что может иметь смысл, но это происходит только тогда, когда я добавляю изображение на страницу, где я хочу отобразить свой канал в Instagram. В остальном работает отлично.