how*_*ode 9 node.js typescript passport-local passport.js
我是 TypeScript 的新手,我在一个只是为了练习而制作的小应用程序中使用 Passport.js 实现了用户身份验证。
\n问题
\n我试图告诉 Passport.js 将用户属性保存id到会话中以进行进一步身份验证,但我只是找不到一种方法来告诉 TypeScript 该id属性user存在。
passport.serializeUser((user, done) => {\n done(undefined, user.id); // Property 'id' does not exists on type 'User' \n});\nRun Code Online (Sandbox Code Playgroud)\n该参数user显示为类型Express.User,但它实际上是 TypeOrm 实体的实例User。通过搜索帖子,我发现我可以扩展类型Express.User以添加我需要使用的属性:
// src/custom-typings/index.d.ts\n namespace Express {\n interface User {\n id?: number;\n }\n }\nRun Code Online (Sandbox Code Playgroud)\n这样做可以消除编码时的错误警告,但是当我尝试编译代码时,错误再次出现,但在我的 VSCode 终端中!
\nsrc/core/passport.ts:38:24 - error TS2339: Property 'id' does not exist on type 'User'.\n\n38 done(undefined, user.id);\n ~~\n\n at createTSError (C:\\Users\\fvg\\Desktop\\Proyectos\\passport-local-example\\node_modules\\ts-node\\src\\index.ts:513:12)\n at reportTSError (C:\\Users\\fvg\\Desktop\\Proyectos\\passport-local-example\\node_modules\\ts-node\\src\\index.ts:517:19)\n at getOutput (C:\\Users\\fvg\\Desktop\\Proyectos\\passport-local-example\\node_modules\\ts-node\\src\\index.ts:752:36)\n at Object.compile (C:\\Users\\fvg\\Desktop\\Proyectos\\passport-local-example\\node_modules\\ts-node\\src\\index.ts:968:32)\n at Module.m._compile (C:\\Users\\fvg\\Desktop\\Proyectos\\passport-local-example\\node_modules\\ts-node\\src\\index.ts:1056:42)\n at Module._extensions..js (internal/modules/cjs/loader.js:1157:10)\n at Object.require.extensions.<computed> [as .ts] (C:\\Users\\fvg\\Desktop\\Proyectos\\passport-local-example\\node_modules\\ts-node\\src\\index.ts:1059:12)\n at Module.load (internal/modules/cjs/loader.js:985:32)\n at Function.Module._load (internal/modules/cjs/loader.js:878:14)\n at Module.require (internal/modules/cjs/loader.js:1025:19)\nRun Code Online (Sandbox Code Playgroud)\n我确实将自定义类型添加到了 tsconfig.json 中:
\n{\n "compilerOptions": {\n "target": "es5", \n "module": "commonjs", \n "lib": ["es6"],\n "outDir": "dist", \n "rootDir": "src", \n "strict": true, \n "typeRoots": ["./src/custom-typings", "./node_modules/@types"], \n "esModuleInterop": true,\n "experimentalDecorators": true, \n "emitDecoratorMetadata": true, \n "resolveJsonModule": true, \n "skipLibCheck": true, \n "forceConsistentCasingInFileNames": true\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n这是我的项目结构:
\n.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 src\n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 core\n\xe2\x94\x82 \xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 passport.ts\n\xe2\x94\x82 \xe2\x94\x82 \n\xe2\x94\x82 \xe2\x94\x82\n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 custom-typings\n\xe2\x94\x82 \xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 index.d.ts\n\xe2\x94\x82 \xe2\x94\x82\n\xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 other stuff\n\xe2\x94\x82 \n\xe2\x94\x82\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 tsconfig.json\nRun Code Online (Sandbox Code Playgroud)\n所有其他解决方案都说这是解决这个典型问题的方法,但我就是无法使其工作,我错过了什么?
\n使用模型中定义的 User 类,而不是应该有 id 的类。您还可以将 id 替换为用户类型中的任何其他唯一标识符。
passport.serializeUser((user: User, done) => {
done(undefined, user.id);
});Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3732 次 |
| 最近记录: |