Путь в узле с переданным параметром не найден - PullRequest
0 голосов
/ 23 января 2019

Я пытаюсь get страницу с express-router, когда внутри url :id предоставляется параметр, использующий пользовательский обратный вызов passport, а url как-то не найден.Вот что у меня в основном файле:

var app = express();
var index = require('./routes/index');

app.post('/login', function(req, res, next) {
  passport.authenticate('local-signup', function(err, user, info) {
    console.log('passport callback');
    console.log(err);
    console.log(info);
    if (err) { return next(err); }
    if (!user) { return res.status(401).json(info); }
    req.logIn(user, function(err) {
      console.log('logIn function of /login path');
      if (err) { return next(err); }
      return res.redirect('/auth/' + user.local.username + '/');
    });
  })(req, res, next);
  console.log('end of login function');
});
app.use('/auth/:id/', passport.authenticate(['facebook-token', 'local-signup']), index);

А внутри index у меня есть:

router.get('/auth/:id/', function(req, res) {
  console.log("router of index.js is sending app.html");
  var appPath = path.join(__dirname, '..', 'public', 'app.html');
  res.sendFile(appPath);
});

Я вижу, что перенаправление на /auth/nik1989/ происходит, но url не найден.

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Чтение из Express 4.x API - Маршрутизатор

// will handle any request that ends in /events
// depends on where the router is "use()'d"
router.get('/events', function(req, res, next) {
  // ..
});

// only requests to /calendar/* will be sent to our "router"
app.use('/calendar', router);

Следуя примеру для вызова events конечной точки, вы должны сделать /calendar/events.

Теперь в вашем случае способ, которым вы вводите промежуточное программное обеспечение явно неправильно

router.get('/auth/:id/', function(req, res) {
  console.log("router of index.js is sending app.html");
  var appPath = path.join(__dirname, '..', 'public', 'app.html');
  res.sendFile(appPath);
});

app.use('/auth/:id/', passport.authenticate(['facebook-token', 'local-signup']), index);

причина, по которой вам нужно позвонить, - /auth/:id/auth/:id/.

Если вы разбиваете код выше, то вы делаете что-то вроде этого

app.use('/auth/:id/',passport..., router.get('/auth/:id/'...)

Есть много способов исправить это, я привел несколько примеров ниже.

Примеры

Рабочий пример один

router.get('/:id', function(req, res) {
  console.log("router of index.js is sending app.html");
  var appPath = path.join(__dirname, '..', 'public', 'app.html');
  res.sendFile(appPath);
});

app.use('/auth', passport.authenticate(['facebook-token', 'local-signup']), index);

Рабочий пример два

router.get('/auth/:id', function(req, res) {
  console.log("router of index.js is sending app.html");
  var appPath = path.join(__dirname, '..', 'public', 'app.html');
  res.sendFile(appPath);
});

app.use(passport.authenticate(['facebook-token', 'local-signup']), index);
0 голосов
/ 23 января 2019

Это должно быть причиной

app.use('/auth/:id/', passport.authenticate(['facebook-token', 'local- 
signup']), index);

у вас уже есть маршрут в вашем файле index.js, который имеет ту же структуру URL /auth/:id/

при использовании app.use ('/ account', accoutRouter); это означает, что любой другой маршрут, вызываемый его приложением .use middleware будет иметь аккаунт / присоединиться к нему, например, аккаунт / логин, аккаунт / зарегистрироваться
я не видел инициализацию паспорта в вашем коде

app.use(passport.initialize());
app.use(passport.session());
passport.use(new LocalStrategy(Account.authenticate()));
passport.serializeUser(Account.serializeUser());
passport.deserializeUser(Account.deserializeUser());

но я верю, используя

router.get('/auth/:id/', function(req, res) {
  console.log("router of index.js is sending app.html");
  var appPath = path.join(__dirname, '..', 'public', 'app.html');
  res.sendFile(appPath);
});

и

app.use('/auth/:id/', passport.authenticate(['facebook-token', 'local- 
signup']), index);

обязательно вызовет ошибки

...