找不到参数传递的节点中的路径

时间:2019-01-23 06:16:28

标签: node.js express passport.js

get express-router内使用自定义回调和url作为参数提供时,我试图用:idpassport的页面找不到{1}}。这是主文件中的内容:

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/

2 个答案:

答案 0 :(得分:1)

这应该是原因

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

您的index.js文件中已经有一条具有相同网址结构的路由   /auth/:id/

当您使用app.use('/ account',accoutRouter); 这意味着他的应用程序.use中间件将调用的其他所有路由 帐户/前缀,例如帐户/登录,帐户/注册
我在您的代码中没有看到护照初始化

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);

肯定会导致错误

答案 1 :(得分:1)

Express 4.x API - Router

// 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);