在get
express-router
内使用自定义回调和url
作为参数提供时,我试图用:id
来passport
的页面找不到{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/
。
答案 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)
// 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);