Search code examples
node.jsmultipartform-datarestify

Sending file using restify with multipart/form-data causes a timeout problem


I have a problem because I am trying to implement file upload using multipart / form-data on my NodeJS server. When I call upload, the file I upload appears in the temporary server folder, but my request does not continue and my client is waiting for a response (in this case the uploadFile method is never running).

enter image description here

upload.router.ts

import {Router} from '../common/router';
import * as restify from 'restify';

class UploadRouter extends Router {

    uploadFile = (req, resp, next) => {
        console.log(req);
        resp.json('test');
    };

    applyRoutes(application: restify.Server) {
        this.basePath = '/upload';

        application.post(`${this.basePath}`, this.uploadFile);
    }
}

export const uploadRouter = new UploadRouter();

server.ts

export class Server {
    application: restify.Server;

    initRoutes(routers: Router[]): Promise<any> {
        return new Promise((resolve, reject) => {
            try {
                const options: restify.ServerOptions = {
                    name: environment.project.name,
                    version: environment.project.version
                };

                if (environment.security.enableHTTPS) {
                    options.certificate = fs.readFileSync(environment.security.certificate);
                    options.key = fs.readFileSync(environment.security.key);
                }

                this.application = restify.createServer(options);
                this.connector = blockchainConnector(environment.blockchain.connector);

                const corsOptions: corsMiddleware.Options = {
                    preflightMaxAge: 10,
                    origins: ['*'],
                    allowHeaders: ['*'],
                    exposeHeaders: []
                };
                const cors: corsMiddleware.CorsMiddleware = corsMiddleware(corsOptions);

                this.application.pre(cors.preflight);

                this.application.use(cors.actual);
                this.application.use(restify.plugins.queryParser());
                this.application.use(restify.plugins.bodyParser());
                this.application.use(restify.plugins.acceptParser(this.application.acceptable));
                this.application.use(restify.plugins.fullResponse());
                this.application.use(restify.plugins.multipartBodyParser({
                    multiples: true,
                    mapParams: true,
                    mapFiles: true,
                    keepExtensions: true,
                    uploadDir: environment.directory.tempDir
                }));
                this.application.use(mergePatchBodyParser);
                this.application.use(tokenParser);

                // routes
                for (let router of routers) {
                    router.applyRoutes(this.application, this.connector);
                    indexRouter.addRouter(router);
                }
                indexRouter.applyRoutes(this.application);

                this.application.listen(environment.server.port, () => {
                    resolve(this.application);
                });

                this.application.on('restifyError', handleError);

            } catch (error) {
                reject(error);
            }
        })
    }

    bootstrap(routers: Router[] = []): Promise<Server> {
        return this.initRoutes(routers).then(() => this);
    }

    shutdown() {
        this.application.close();
    }
}

Solution

  • I realize that this is 8 months later, but it looks like you forgot to call next() in uploadFile