启用自定义中间件时 Strapi 后端损坏
Strapi backend broken when enable custom middleware
我创建了一个自定义中间件,当我启用它时,它使 api 和管理员无法访问。
中间件非常简单,它为服务器上的传入请求添加一个请求 ID:
const { createNamespace } = require('cls-hooked');
const { v4: uuidv4 } = require('uuid');
const loggerNamespace = createNamespace('logger');
module.exports = (strapi) => {
return {
initialize() {
strapi.app.use((ctx, next) => {
const reqId = ctx.request.get('X-Request-Id') || uuidv4();
ctx.response.set('X-Request-Id', reqId);
loggerNamespace.run(() => {
loggerNamespace.set('requestId', reqId);
next();
});
});
},
};
};
使用配置文件启用./config/middleware.json
:
module.exports = {
settings: {
addRequestId: {
enabled: true,
},
},
};
然后,启用后,调用 API 端点或尝试连接到管理员会导致 404
未找到。
我将 strapi 3.6.8
与节点 14.18.1
一起使用。
知道为什么吗?
PS:我怀疑 cls-hooked
是罪魁祸首,但删除它以使用贫血中间件进行测试也不起作用。
@Salvino 让我走上正轨,建议我等待 next
.
的执行
在cls-hooked
的代码中挖掘,我找到了类似于run
的方法runPromise
和returns一个可以等待的Promise
.它解决了这个问题。
固定码:
const { createNamespace } = require('cls-hooked');
const { v4: uuidv4 } = require('uuid');
const loggerNamespace = createNamespace('logger');
module.exports = (strapi) => {
return {
initialize() {
strapi.app.use(async (ctx, next) => {
const reqId = ctx.request.get('X-Request-Id') || uuidv4();
ctx.response.set('X-Request-Id', reqId);
await loggerNamespace.runPromise(async () => {
loggerNamespace.set('requestId', reqId);
await next();
});
});
},
};
};
我创建了一个自定义中间件,当我启用它时,它使 api 和管理员无法访问。
中间件非常简单,它为服务器上的传入请求添加一个请求 ID:
const { createNamespace } = require('cls-hooked');
const { v4: uuidv4 } = require('uuid');
const loggerNamespace = createNamespace('logger');
module.exports = (strapi) => {
return {
initialize() {
strapi.app.use((ctx, next) => {
const reqId = ctx.request.get('X-Request-Id') || uuidv4();
ctx.response.set('X-Request-Id', reqId);
loggerNamespace.run(() => {
loggerNamespace.set('requestId', reqId);
next();
});
});
},
};
};
使用配置文件启用./config/middleware.json
:
module.exports = {
settings: {
addRequestId: {
enabled: true,
},
},
};
然后,启用后,调用 API 端点或尝试连接到管理员会导致 404
未找到。
我将 strapi 3.6.8
与节点 14.18.1
一起使用。
知道为什么吗?
PS:我怀疑 cls-hooked
是罪魁祸首,但删除它以使用贫血中间件进行测试也不起作用。
@Salvino 让我走上正轨,建议我等待 next
.
在cls-hooked
的代码中挖掘,我找到了类似于run
的方法runPromise
和returns一个可以等待的Promise
.它解决了这个问题。
固定码:
const { createNamespace } = require('cls-hooked');
const { v4: uuidv4 } = require('uuid');
const loggerNamespace = createNamespace('logger');
module.exports = (strapi) => {
return {
initialize() {
strapi.app.use(async (ctx, next) => {
const reqId = ctx.request.get('X-Request-Id') || uuidv4();
ctx.response.set('X-Request-Id', reqId);
await loggerNamespace.runPromise(async () => {
loggerNamespace.set('requestId', reqId);
await next();
});
});
},
};
};