Как исправить «SyntaxError: неожиданный токен o в JSON в позиции 1» на сервере NodeJS / Express - PullRequest
0 голосов
/ 13 марта 2020

Я отправляю сетевой запрос POST от функции javascript на сервер node.js. Я получаю этот ответ об ошибке на внешнем интерфейсе:

Доступ к выборке в 'https://server.herokuapp.com/connect/link' из источника 'http://localhost: 8888 ' был заблокирован политикой CORS: в запрошенном ресурсе отсутствует заголовок «Access-Control-Allow-Origin». Если непрозрачный ответ удовлетворяет вашим потребностям, установите режим запроса 'no-cors', чтобы получить ресурс с отключенным CORS.

javascript, который использует fetch(), чтобы сделать вызов похожим на этот :

function submitId() {
  $("#progress-label").text("Working...")
  const request = {
    method: "POST",
    body: {
      docId: $('#id').val(),
      stripeId: USER_ID
    },
    mode: 'cors',
    headers: { 'Content-Type': 'application/json'}
  }
  fetch(SERVER_URL + "/link", request).then(res => {
    document.getElementById("label").innerHTML = res.msg
  }).catch(err => {
    document.getElementById("label").innerHTML = res.msg
  })
 }

Node.js сервер:

var express = require('express'),
    stripeConnect = require('./routes/connect'),
    cors = require('cors'),
    bodyParser = require('body-parser');

var app = express();

app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

app.use(cors());

app.use(function (req, res, next) {
    res.header('Access-Control-Allow-Origin', '*');
    res.header('Access-Control-Allow-Credentials', 'true');
    next();
});

app.use('/connect', connect);

app.listen(process.env.PORT || 5000);

маршруты / соединения. js выглядит так:

const express = require('express');
const router = express.Router();
const admin = require('firebase-admin');
admin.initializeApp({
    credential: admin.credential.cert({
        projectId: process.env.projectId,
        clientEmail: process.env.clientEmail,
        privateKey: process.env.privateKey.replace(/\\n/g, '\n'),
        clientId: process.env.clientId
    }),
    databaseURL: process.env.databaseURL
});
const STRIPE_SK = 'sk_test_KEY';
const stripe = require('stripe')(STRIPE_SK);

// @route POST /stripeConnect/link
// @desc save stripe user account id to their firebase profile
// @access public
router.post('/link', (req, res) => {
    console.log('\nSTRIPE-LINK-REQUEST-BODY => ');
    console.log(req.body);

    return admin
        .firestore()
        .collection('users')
        .doc(req.body.docId)
        .update({ stripeId: req.body.stripeId })
        .then((success) => res.json({ msg: 'Stripe account ID added to profile.' }))
        .catch((err) => res.json({ msg }));
});

module.exports = router;

ошибка, полученная на стороне сервера is:

SyntaxError: Неожиданный токен o в JSON в позиции 1 2020-03-13T00: 10: 29.151249 + 00: 00 app [web.1]: в JSON .parse ( ) 2020-03-13T00: 10: 29.151251 + 00: 00 приложение [web.1]: при разборе (/app/node_modules/body-parser/lib/types/json.js:89:19) 2020 -03-13T00: 10: 29.151251 + 00: 00 приложение [web.1]: в /app/node_modules/body-parser/lib/read.js:121:18 2020-03-13T00: 10: 29.151251+ Приложение 00:00 [web.1]: at invokeCallback (/app/node_modules/raw-body/index.js:224:16) 2020-03-13T00: 10: 29.151251 + 00: 00 приложение [web.1 ]: на готово (/app/node_modules/raw-body/index.js:213:7) 2020-03-13T00: 10: 29.151252 + 00: 00 приложение [web.1]: на IncomingMessage.onEnd (/ приложение / node_modules / сырым-бо dy / index. js: 273: 7) 2020-03-13T00: 10: 29.151253 + 00: 00 app [web.1]: at IncomingMessage.emit (events. js: 323: 22) 2020-03 -13T00: 10: 29.151253 + приложение 00: 00 [web.1]: at endReadableNT (_stream_readable. js: 1204: 12) 2020-03-13T00: 10: 29.151253 + 00: 00 приложение [web.1]: at processTicksAndRejected (внутренняя / process / task_queues. js: 84: 21)

Как это исправить, чтобы успешно отправить запрос на публикацию?

1 Ответ

2 голосов
/ 13 марта 2020

Ваша ошибка на стороне сервера не указывает на ошибку CORS. Это указывает на ошибку синтаксического анализа JSON.

Мне кажется, что вы неправильно отправляете контент JSON, поэтому получатель получает ошибку синтаксического анализа JSON. С fetch() вы должны вручную превратить ваши данные в JSON перед отправкой. Измените это:

body: {
  docId: $('#id').val(),
  stripeId: USER_ID
},

на это:

body: JSON.stringify({
  docId: $('#id').val(),
  stripeId: USER_ID
}),

См. JSON пример отправки по MDN .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...