代码之家  ›  专栏  ›  技术社区  ›  ajaysinghdav10d dhilt

HapiJs文件上载:上载大文件时出现500内部服务器错误,回复永远不会返回到调用方

  •  0
  • ajaysinghdav10d dhilt  · 技术社区  · 6 年前

    我们正在使用IISNODE托管使用“hapi”编写的节点应用程序“^16.5.2”,路径粘贴在下面

    { 
        method: 'POST',
        path: '/xxxx/xxxx/xxxx/Upload/',
        config: {
            auth: { strategies: ['simple'] },
            handler: uploadHandler.Upload,
            plugins: {
                'hapi-swagger': {
                    responses: fileHTTPStatus,
                    payloadType: 'form'
                },
                disinfect: {
                    disinfectQuery: false,
                    disinfectParams: false,
                    disinfectPayload: false
                },
                policies: ['MethodAudit']
            },
            tags: ['api'],
            validate: {
                payload: {
                    file: Joi.any().meta({ swaggerType: 'file' }).required().description('file')
                }
            },
            payload: {
                maxBytes: 209715200,
                parse: true,
                allow: 'multipart/form-data',
                output: 'stream'
            },
            cors: {
                origin: ['*'],
                additionalHeaders: ['cache-control', 'x-requested-with', 'accept', 'authorization', 'content-type', 'if-none-match', 'origin', 'Accept-language']
            }
        }
    }
    

    uploadHandler.Upload方法如下:

    function Upload (request, reply) {
    if (request.payload) {
        var data = request.payload;
    
        if (data.file) {
    
            var originalName = data.file.hapi.filename;
    
            var path = rootDocPath + originalName; //rootDocPath is our common location
    
            var file = fs.createWriteStream(path);
    
            file.on('error', function (err) {
                console.error(err)
            });
    
            data.file.pipe(file);
    
            file.on('end', function() {
                console.log('file ended');
            });
    
            file.on('finish', function() {
                console.log('file finished');
            });
    
            data.file.on('end', function(err) {
                console.log('data.file ended');
            });
    
            file.on('close', function(err) {
                reply('Uploaded');
            });
    
        } else {
            reply('no file')
        }
    } else {
        reply('no payload')
    }
    

    }

    IIS 8.5详细错误-500.1013-内部服务器错误

    • 在调试时,我们可以看到正在执行应答(“上载”),但调用方从未收到应答。
    • MB),对于较小的文件,它可以100%工作
    0 回复  |  直到 6 年前
        1
  •  0
  •   metoikos    6 年前

    也许你的水管里有什么东西。

    这是我的 使用承诺的上传我从来没有一个问题。也许你可以和你的过程比较一下。

    const fileUploader = function (file, targetPath) {
        if (!file) throw new Error('no file');
        const fileStream = fs.createWriteStream(targetPath);
    
        return new Promise((resolve, reject) => {
            file.on('error', function (err) {
                reject(err);
            });
    
            file.pipe(fileStream);
    
            file.on('end', function (err) {
                resolve({
                    fieldname: file.hapi.name,
                    originalname: file.hapi.filename,
                    mimetype: file.hapi.headers['content-type'],
                    targetPath,
                    size: fs.statSync(targetPath).size,
                });
            })
        })
    };
    
    // usage
    const filePath = await helpers.fileUploader(request.payload.data, targetPath);
    
        2
  •  0
  •   ajaysinghdav10d dhilt    6 年前

    对我有效的修复方法是在向调用者发送响应之前将请求有效负载设置为空。似乎如果请求负载太大,服务将无法响应。请参阅下面的修复(查看评论 这就是解决办法

    function Upload (request, reply) {
     if (request.payload) {
        var data = request.payload;
    
        if (data.file) {
    
            var originalName = data.file.hapi.filename;
    
            var path = rootDocPath + originalName; //rootDocPath is our common location
    
            var file = fs.createWriteStream(path);
    
            file.on('error', function (err) {
                console.error(err)
            });
    
            data.file.pipe(file);
    
            file.on('end', function() {
                console.log('file ended');
            });
    
            file.on('finish', function() {
                console.log('file finished');
            });
    
            data.file.on('end', function(err) {
                console.log('data.file ended');
            });
    
            file.on('close', function(err) {
                request.payload.file = null; /*This is the FIX*/
                reply('Uploaded');
            });
    
        } else {
            reply('no file')
        }
     } else {
         reply('no payload')
     }
    }
    
    推荐文章