Hapi 是一个流行的 Node.js 框架,用于构建应用程序和服务。在 Hapi 中处理 HTTP 请求时,有效负载(payload)指的是请求体(body)中的数据,通常是 POST、PUT 等请求方法中发送的数据。
Hapi 默认不会自动解析请求体,需要在路由配置中明确指定。
解决方案:
server.route({
method: 'POST',
path: '/example',
handler: (request, h) => {
return request.payload; // 现在可以访问payload
},
options: {
payload: {
parse: true, // 启用解析
output: 'data' // 默认值,也可以设置为'stream'或'file'
}
}
});
Hapi 默认只解析 application/json
和 application/x-www-form-urlencoded
类型的内容。
解决方案:
options: {
payload: {
parse: true,
allow: ['application/json', 'text/plain', 'multipart/form-data'] // 添加需要支持的类型
}
}
默认情况下,Hapi 限制有效负载大小为 1MB。
解决方案:
options: {
payload: {
maxBytes: 1048576 * 10 // 设置为10MB
}
}
如果设置为流式处理,需要以不同方式访问数据。
解决方案:
options: {
payload: {
output: 'stream',
parse: false
}
}
// 在handler中
handler: async (request, h) => {
let data = '';
request.payload.on('data', (chunk) => {
data += chunk;
});
return new Promise((resolve) => {
request.payload.on('end', () => {
resolve(data);
});
});
}
处理文件上传时需要特殊配置。
解决方案:
const path = require('path');
const fs = require('fs');
options: {
payload: {
output: 'file',
parse: true,
allow: 'multipart/form-data',
multipart: true,
maxBytes: 1048576 * 10 // 10MB
}
}
// 在handler中
handler: async (request, h) => {
const files = request.payload.file; // 假设前端字段名为'file'
const tempPath = files.path;
const newPath = path.join(__dirname, 'uploads', files.filename);
fs.renameSync(tempPath, newPath);
return { success: true };
}
Content-Type
是否正确server.ext('onRequest', (request, h) => {
console.log('Incoming request:', request.method, request.path);
return h.continue;
});
通过以上方法和配置,应该能够解决 Hapi 中请求有效负载未显示的问题。
没有搜到相关的文章