"Cannot read property '_csrf' of undefined" 将 NestJS 与 Fastify 适配器和 "fastify-csrf" 插件一起使用时?
"Cannot read property '_csrf' of undefined" when using NestJS with Fastify adapter and "fastify-csrf" plugin?
我正在使用 Fastify 适配器将 fastify-csrf
包注册到 NestJS 应用程序。我只是想向站点的根目录 (/) 发送 GET 请求。它一直给我错误:
[1579681476193] INFO (5105 on a89d529a4532): incoming request
reqId: 1
req: {
"method": "GET",
"url": "/",
"hostname": "localhost:3000",
"remoteAddress": "172.18.0.1",
"remotePort": 47274
}
[Nest] 5105 - 01/22/2020, 8:24:36 AM [ExceptionsHandler] Cannot read property '_csrf' of undefined +3497ms
TypeError: Cannot read property '_csrf' of undefined
at getSecret (/home/node/work-dir/dist/main.js:4123:26)
at Object.handleCsrf (/home/node/work-dir/dist/main.js:4058:16)
at hookIterator (/home/node/work-dir/node_modules/fastify/lib/hooks.js:124:10)
at next (/home/node/work-dir/node_modules/fastify/lib/hooks.js:70:20)
at hookRunner (/home/node/work-dir/node_modules/fastify/lib/hooks.js:84:3)
at preValidationCallback (/home/node/work-dir/node_modules/fastify/lib/handleRequest.js:92:5)
at handler (/home/node/work-dir/node_modules/fastify/lib/handleRequest.js:69:5)
at handleRequest (/home/node/work-dir/node_modules/fastify/lib/handleRequest.js:18:5)
at onRunMiddlewares (/home/node/work-dir/node_modules/fastify/lib/middleware.js:22:5)
at Holder.done (/home/node/work-dir/node_modules/middie/middie.js:90:9)
at xXssProtection (/home/node/work-dir/node_modules/x-xss-protection/dist/index.js:47:13)
at Holder.done (/home/node/work-dir/node_modules/middie/middie.js:112:11)
at nosniff (/home/node/work-dir/node_modules/dont-sniff-mimetype/dist/index.js:5:9)
at Holder.done (/home/node/work-dir/node_modules/middie/middie.js:112:11)
at ienoopen (/home/node/work-dir/node_modules/ienoopen/dist/index.js:5:9)
at Holder.done (/home/node/work-dir/node_modules/middie/middie.js:112:11)
[1579681476213] INFO (5105 on a89d529a4532): request completed
reqId: 1
res: {
"statusCode": 500
}
responseTime: 17.487376004457474
这是我的项目的样子:
/*************************
* app.controller.ts
*************************/
import { Controller, Get } from '@nestjs/common';
@Controller()
export class AppController {
@Get()
async getAPI(): Promise<string> {
return 'test';
}
}
/*************************
* app.module.ts
*************************/
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
@Module({ controllers: [AppController]})
export class AppModule {}
/*************************
* main.ts
*************************/
import { FastifyAdapter, NestFastifyApplication } from '@nestjs/platform-fastify';
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
async function bootstrap() {
const app = await NestFactory.create<NestFastifyApplication>(
AppModule,
new FastifyAdapter({ logger: { prettyPrint: true } }),
);
app.register(require('fastify-cookie'), { secret: 'cookieSecret' });
app.register(require('fastify-csrf'), { cookie: true });
await app.listen(3000, '0.0.0.0');
}
bootstrap();
显然我没有正确地将 cookie 设置为 true。在以下位置:
app.register(require('fastify-csrf'), { cookie: true });
我使用了一个变量,但没有正确调用它,导致它是undefined
。
app.register(require('fastify-csrf'), csrfOptions);
检查包代码后,如果 options
对象中的 cookie
未设置为 true
或 {}
,它将假定会话配置是通过:
var cookie = getCookieOptions(opts.cookie);
var sessionCsrfKey = options.key || '_csrf';
/* ... */
function isCookieContainer(cookie) {
if(cookie || typeof cookie === 'object') {
return true;
}
return false;
}
function getSecret(request, cookie) {
var container = tokenContainer(request, cookie);
if(isCookieContainer(cookie)) {
return container[cookie.key];
} else {
return request.session[sessionCsrfKey]; // <-- This is where the error occurs.
}
}
我正在使用 Fastify 适配器将 fastify-csrf
包注册到 NestJS 应用程序。我只是想向站点的根目录 (/) 发送 GET 请求。它一直给我错误:
[1579681476193] INFO (5105 on a89d529a4532): incoming request
reqId: 1
req: {
"method": "GET",
"url": "/",
"hostname": "localhost:3000",
"remoteAddress": "172.18.0.1",
"remotePort": 47274
}
[Nest] 5105 - 01/22/2020, 8:24:36 AM [ExceptionsHandler] Cannot read property '_csrf' of undefined +3497ms
TypeError: Cannot read property '_csrf' of undefined
at getSecret (/home/node/work-dir/dist/main.js:4123:26)
at Object.handleCsrf (/home/node/work-dir/dist/main.js:4058:16)
at hookIterator (/home/node/work-dir/node_modules/fastify/lib/hooks.js:124:10)
at next (/home/node/work-dir/node_modules/fastify/lib/hooks.js:70:20)
at hookRunner (/home/node/work-dir/node_modules/fastify/lib/hooks.js:84:3)
at preValidationCallback (/home/node/work-dir/node_modules/fastify/lib/handleRequest.js:92:5)
at handler (/home/node/work-dir/node_modules/fastify/lib/handleRequest.js:69:5)
at handleRequest (/home/node/work-dir/node_modules/fastify/lib/handleRequest.js:18:5)
at onRunMiddlewares (/home/node/work-dir/node_modules/fastify/lib/middleware.js:22:5)
at Holder.done (/home/node/work-dir/node_modules/middie/middie.js:90:9)
at xXssProtection (/home/node/work-dir/node_modules/x-xss-protection/dist/index.js:47:13)
at Holder.done (/home/node/work-dir/node_modules/middie/middie.js:112:11)
at nosniff (/home/node/work-dir/node_modules/dont-sniff-mimetype/dist/index.js:5:9)
at Holder.done (/home/node/work-dir/node_modules/middie/middie.js:112:11)
at ienoopen (/home/node/work-dir/node_modules/ienoopen/dist/index.js:5:9)
at Holder.done (/home/node/work-dir/node_modules/middie/middie.js:112:11)
[1579681476213] INFO (5105 on a89d529a4532): request completed
reqId: 1
res: {
"statusCode": 500
}
responseTime: 17.487376004457474
这是我的项目的样子:
/*************************
* app.controller.ts
*************************/
import { Controller, Get } from '@nestjs/common';
@Controller()
export class AppController {
@Get()
async getAPI(): Promise<string> {
return 'test';
}
}
/*************************
* app.module.ts
*************************/
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
@Module({ controllers: [AppController]})
export class AppModule {}
/*************************
* main.ts
*************************/
import { FastifyAdapter, NestFastifyApplication } from '@nestjs/platform-fastify';
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
async function bootstrap() {
const app = await NestFactory.create<NestFastifyApplication>(
AppModule,
new FastifyAdapter({ logger: { prettyPrint: true } }),
);
app.register(require('fastify-cookie'), { secret: 'cookieSecret' });
app.register(require('fastify-csrf'), { cookie: true });
await app.listen(3000, '0.0.0.0');
}
bootstrap();
显然我没有正确地将 cookie 设置为 true。在以下位置:
app.register(require('fastify-csrf'), { cookie: true });
我使用了一个变量,但没有正确调用它,导致它是undefined
。
app.register(require('fastify-csrf'), csrfOptions);
检查包代码后,如果 options
对象中的 cookie
未设置为 true
或 {}
,它将假定会话配置是通过:
var cookie = getCookieOptions(opts.cookie);
var sessionCsrfKey = options.key || '_csrf';
/* ... */
function isCookieContainer(cookie) {
if(cookie || typeof cookie === 'object') {
return true;
}
return false;
}
function getSecret(request, cookie) {
var container = tokenContainer(request, cookie);
if(isCookieContainer(cookie)) {
return container[cookie.key];
} else {
return request.session[sessionCsrfKey]; // <-- This is where the error occurs.
}
}