#javascript #node.js #express
#язык JavaScript #node.js #экспресс
Вопрос:
Я пытаюсь получить идентификатор твита в качестве ввода формы, а затем использовать API twitter для запроса данных об этом конкретном твите. Проблема в том, что по какой-то причине данные JSON не возвращаются должным образом.
router.post('/', async function(req, res, next) { let tweet_id = req.body.tweet_id; //'1466189950135640065'; console.log(tweet_id); let tweet = await fetch(`https://api.twitter.com/2/tweets/${tweet_id}`, { method: 'post', headers: new Headers({ 'Authorization': `Bearer ${BEARER_TOKEN}`, }) }) .then(res =gt; res.json()) .then(json =gt; console.log(json)) .catch(err =gt; console.log(err)); res.render('index'); });
Приведенный выше код выдает следующее сообщение об ошибке
FetchError: invalid json response body at https://api.twitter.com/2/tweets/1036132920556232705 reason: Unexpected token A in JSON at position 0
Я думаю, что это связано с тем фактом, что я потребляю тело ответа в виде JSON, и поток ответов на этом останавливается. Но даже если я прокомментирую, .then(res =gt; res.json())
я действительно получу что-то в своем console.log
, но я не вижу ожидаемого результата.
Я должен выглядеть так
{"data":{"id":"1036132920556232705","text":"Other sites of yours truly to follow...."}}
Вместо этого я получаю нечто совершенно другое
Response { size: 0, timeout: 0, [Symbol(Body internals)]: { body: Gunzip { _writeState: [Uint32Array], _readableState: [ReadableState], _events: [Object: null prototype], _eventsCount: 5, _maxListeners: undefined, _writableState: [WritableState], allowHalfOpen: true, bytesWritten: 0, _handle: [Zlib], _outBuffer: lt;Buffer 41 70 70 6c 69 63 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 70 65 72 66 6f 72 6d 20 77 72 69 74 65 20 61 63 74 69 6f 6e 73 2e 20 43 6f 6e 74 61 63 74 20 ... 16334 more bytesgt;, _outOffset: 0, _chunkSize: 16384, _defaultFlushFlag: 2, _finishFlushFlag: 2, _defaultFullFlushFlag: 3, _info: undefined, _maxOutputLength: 4294967296, _level: -1, _strategy: 0, [Symbol(kCapture)]: false, [Symbol(kCallback)]: null, [Symbol(kError)]: null }, disturbed: false, error: null }, [Symbol(Response internals)]: { url: 'https://api.twitter.com/2/tweets/1036132920556232705', status: 403, statusText: 'Forbidden', headers: Headers { [Symbol(map)]: [Object: null prototype] }, counter: 0 } }
Я нигде не вижу ни data
, id
, ни text
ключей. Что я здесь делаю не так?
Комментарии:
1. Вы хотите отправить почтовый запрос без тела? Можете ли вы сослаться на документацию по API?
2. @Фил да, вот и все. Ух ты, не могу поверить, что я это сделал. Я думаю, что меня перепутали с Express.js ОПУБЛИКУЙТЕ и получите API. Большое спасибо
3. Какой
fetch
библиотекой вы пользуетесь?4. Параметр обратного вызова для экспресс-маршрута и параметр обратного вызова для выборки
res
совпадают. Вы можете рассмотреть возможность изменения одного из них, чтобы избежать путаницы. Кроме того, ваша авторизация недействительна.5. @код, который я использую
node-fetch
, все, кажется, работает сейчас. Я использую токен на предъявителя OAuth в качестве авторизации, которая работает.
Ответ №1:
Если только Фил не захочет дать ответ, который я с радостью приму, моя проблема заключалась в том, что я установил method: POST
вместо GET для вызова API. Это была глупая ошибка.