@Alisa94

Как перейти на нужный адрес?

Проблема связана с разделением server.js файла на модули. Я работаю на просмотрщиком(viewer) платформы autodesk.forge и по документации создал этот просмотрщиком. Для создания сервера используется express и axios(ну и другие технологии, но проблема связано с упомянутыми технологиями). Так же создал папку public, в ней html файл с гиперссылкой аутентификации.

Ниже приведу рабочий код.

const path = require('path');
const express = require('express');         
const Axios = require('axios');              
const bodyParser = require('body-parser');    
const querystring = require('querystring');



let app = express();
app.use(bodyParser.json());



const config = require('./config');

const PORT = config.credentials.PORT; 


app.set('port', 3000);
let server = app.listen(PORT, () => { console.log(`Server listening on port ${PORT}`); });


let access_token = '';


if (process.env.FORGE_CLIENT_ID == null || process.env.FORGE_CLIENT_SECRET == null) {
    console.error('Missing FORGE_CLIENT_ID or FORGE_CLIENT_SECRET env. variables.');
    return;
}


app.get('/api/forge/oauth', function (req, res) {
  Axios({
    method: 'POST',
    url: 'https://developer.api.autodesk.com/authentication/v1/authenticate',
    headers: {
      'content-type': 'application/x-www-form-urlencoded',
    },
    data: querystring.stringify({
      client_id: config.credentials.client_id,
      client_secret: config.credentials.client_secret,
      grant_type: 'client_credentials',
      scope: config.scopes.internal
    })
})
    .then(function (response) {
      access_token = response.data.access_token;
      console.log(response);
      res.redirect('/api/forge/datamanagement/bucket/create');
    })
    .catch(function (error) {
      console.log(error);
      res.send('Failed to authenticate');
    });
});


<body>
    <main id="main">
        <a href="/api/forge/oauth">Authorize me!</a>
    </main>
</body>


После дробления этого кода на модуль он перестаёт работать, вот изменённый server.js

const path = require('path');
const express = require('express');        
const Axios = require('axios');            
const bodyParser = require('body-parser'); 
const querystring = require('querystring');


let app = express();
app.use(bodyParser.json());
app.use(express.static(path.join(__dirname, 'public'))); 

const config = require('./config');

const PORT = config.credentials.PORT;


app.use('/api/forgee', require('./routes/oauth'));
app.use((err, req, res, next) => {
  console.error(err);
  res.status(err.statusCode).json(err);
});


let server = app.listen(PORT, () => { console.log(`Server listening on port ${PORT}`); });


А вот его модуль oauth.js

const path = require('path');
const express = require('express');
const Axios = require('axios');
const querystring = require('querystring');        

const config = require('../config');

let router = express.Router();
let access_token = '';


if (process.env.FORGE_CLIENT_ID == null || process.env.FORGE_CLIENT_SECRET == null) {
    console.error('Missing FORGE_CLIENT_ID or FORGE_CLIENT_SECRET env. variables.');
    return;
}


router.get('/api/forge/oauth', function (req, res) {
  Axios({
    method: 'POST',
    url: 'https://developer.api.autodesk.com/authentication/v1/authenticate',
    headers: {
      'content-type': 'application/x-www-form-urlencoded',
    },
    data: querystring.stringify({
      client_id: config.credentials.client_id,
      client_secret: config.credentials.client_secret,
      grant_type: 'client_credentials',
      scope: config.scopes.internal
    })
})
    .then(function (response) {
      access_token = response.data.access_token;
      console.log(response);
      res.redirect('/api/forge/datamanagement/bucket/create');
    })
    .catch(function (error) {
      console.log(error);
      res.send('Failed to authenticate');
    });
});

module.exports = router;


Разделённый на модули код работает так: сервер запускается на порту 3000, появляется страницы гиперссылкой, после нажатия на неё открывается страница с текстом "Cannot GET /api/forge/oauth". Я проверял и убеждался, что модуль oauth.js подключён к основному файлу, но почему axios не может найти страницу /api/forge/oauth я не понимаю.

У меня файл сервера работает без проблем, но когда дроблю на модули появляются проблемы.
  • Вопрос задан
  • 82 просмотра
Решения вопроса 1
@yapaha
Разработчик
Замените "router.get('/api/forge/oauth'.." на "router.get('/oauth'..." в oauth.js
И app.use('/api/forgee', require('./routes/oauth')); на app.use('/api/forge', require('./routes/oauth'));

Иначе у вас получается URL "/api/forgee/api/forge/oauth"
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы