passport.js 中完成的打字稿静态类型是什么?
What is the typescript static type for done in passport.js?
在 passport.js 中有一个 done 函数,为此使用的正确类型是什么?
例如,
passport.use(new HeaderAPIKeyStrategy(
{ header: 'Authorization', prefix: 'Api-Key ' },
false,
function(apikey: string, done: <<WHAT GOES HERE>> ) {
User.findOne({ apikey: apikey }, function (err, user) {
if (err) { return done(err); }
if (!user) { return done(null, false); }
return done(null, user);
});
}
));
用什么类型替换 'WHAT GOES HERE' 文本?
我看到您正在使用 passport-headerapikey
,它是 passport.js 的 third-party 扩展 - 幸运的是,它已经用 TypeScript 编写了。
但无论如何,make sure you're using the latest @types
for passport.js。
Going by the public source code on GitHub,HeaderAPIKeyStrategy
的构造函数的定义是:
constructor(
header : { header: string, prefix: string },
passReqToCallback: boolean,
verify : (apiKey: string, verified: (err: Error | null, user?: Object, info?: Object) => void, req?: Request) => void
)
我看到 verify
参数的签名很啰嗦。我很惊讶他们没有使用 type x = y
语句来提高可读性。
但您可以定义自己的:
type VerifiedUserOrErrorFunc = ( err: Error | null, user?: Object, info?: Object ) => void;
type VerifyCallback = ( apiKey: string, verified: VerifiedUserOrErrorFunc, req?: Request ) => void;
// So the constructor would be:
/*
constructor(
header : { header: string, prefix: string },
passReqToCallback: boolean,
verify : VerifyCallback
)
*/
所以这应该有效。请注意,没有 done
函数。只是您为所有结果(错误、not-found、成功)调用的 verified
回调。另请注意,与 Passport.js 的其他 Strategy
对象不同,HeaderAPIKeyStrategy
似乎不使用异步 Promises(因为回调所有 return void
)。
type VerifiedUserOrErrorFunc = ( err: Error | null, user?: Object, info?: Object ) => void;
type VerifyCallback = ( apiKey: string, verified: VerifiedUserOrErrorFunc, req?: Request ) => void;
const strategyVerifyCallback = function( apikey: string, verified: VerifiedUserOrErrorFunc, req?: Request ): void {
User.findOne( { apikey: apikey }, function( err, user ) {
if( err ) {
verified( err );
}
else if( user ) {
verified( /*err*/ null, user );
}
else {
verified( new Error( "User not found" ) );
}
} );
};
const strategy = new HeaderAPIKeyStrategy(
/* header : */ { header: 'Authorization', prefix: 'Api-Key ' },
/* passReqToCallback: */ false,
/* verify : */ strategyVeriyCallback
);
passport.use( strategy );
在 passport.js 中有一个 done 函数,为此使用的正确类型是什么?
例如,
passport.use(new HeaderAPIKeyStrategy(
{ header: 'Authorization', prefix: 'Api-Key ' },
false,
function(apikey: string, done: <<WHAT GOES HERE>> ) {
User.findOne({ apikey: apikey }, function (err, user) {
if (err) { return done(err); }
if (!user) { return done(null, false); }
return done(null, user);
});
}
));
用什么类型替换 'WHAT GOES HERE' 文本?
我看到您正在使用 passport-headerapikey
,它是 passport.js 的 third-party 扩展 - 幸运的是,它已经用 TypeScript 编写了。
但无论如何,make sure you're using the latest @types
for passport.js。
Going by the public source code on GitHub,HeaderAPIKeyStrategy
的构造函数的定义是:
constructor(
header : { header: string, prefix: string },
passReqToCallback: boolean,
verify : (apiKey: string, verified: (err: Error | null, user?: Object, info?: Object) => void, req?: Request) => void
)
我看到 verify
参数的签名很啰嗦。我很惊讶他们没有使用 type x = y
语句来提高可读性。
但您可以定义自己的:
type VerifiedUserOrErrorFunc = ( err: Error | null, user?: Object, info?: Object ) => void;
type VerifyCallback = ( apiKey: string, verified: VerifiedUserOrErrorFunc, req?: Request ) => void;
// So the constructor would be:
/*
constructor(
header : { header: string, prefix: string },
passReqToCallback: boolean,
verify : VerifyCallback
)
*/
所以这应该有效。请注意,没有 done
函数。只是您为所有结果(错误、not-found、成功)调用的 verified
回调。另请注意,与 Passport.js 的其他 Strategy
对象不同,HeaderAPIKeyStrategy
似乎不使用异步 Promises(因为回调所有 return void
)。
type VerifiedUserOrErrorFunc = ( err: Error | null, user?: Object, info?: Object ) => void;
type VerifyCallback = ( apiKey: string, verified: VerifiedUserOrErrorFunc, req?: Request ) => void;
const strategyVerifyCallback = function( apikey: string, verified: VerifiedUserOrErrorFunc, req?: Request ): void {
User.findOne( { apikey: apikey }, function( err, user ) {
if( err ) {
verified( err );
}
else if( user ) {
verified( /*err*/ null, user );
}
else {
verified( new Error( "User not found" ) );
}
} );
};
const strategy = new HeaderAPIKeyStrategy(
/* header : */ { header: 'Authorization', prefix: 'Api-Key ' },
/* passReqToCallback: */ false,
/* verify : */ strategyVeriyCallback
);
passport.use( strategy );