node.jsnginxexpresslocomotivejs

setting response headers with expressjs behind nginx


We have an web application build using node js (express js), which is behind nginx.

For a particular API, we want to have the content-type response header as "text/plain". For this following code is there in controller.

res.setHeader('Content-Type', 'text/plain'); res.send(response);

This works when the server is not behind nginx. But when the server is behind nginx, the response headers are still 'application/json'

my nginx configuration is mentioned below:

#kZyguser www-data;
user root;
worker_processes 4;
pid /var/run/nginx.pid;

events {
        worker_connections 20000;
        # multi_accept on;
}

http {

        ##
        # Basic Settings
        ##

        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;
        keepalive_timeout 65;
        types_hash_max_size 2048;
        # server_tokens off;

        # server_names_hash_bucket_size 64;
        # server_name_in_redirect off;

        include /etc/nginx/mime.types;
        default_type application/octet-stream;

        ##
        # Logging Settings
        ##
        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;

        ##
        # Gzip Settings
        ##

        gzip on;
        gzip_disable "msie6";

        # gzip_vary on;
        # gzip_proxied any;
        # gzip_comp_level 6;
        # gzip_buffers 16 8k;
        # gzip_http_version 1.1;

         gzip_types text/plain text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript;



        client_max_body_size '10M';
 ##
        # nginx-naxsi config
        ##
        # Uncomment it if you installed nginx-naxsi
        ##

        #include /etc/nginx/naxsi_core.rules;

        ##
        # nginx-passenger config
        ##
        # Uncomment it if you installed nginx-passenger
        ##

        #passenger_root /usr;
        #passenger_ruby /usr/bin/ruby;

        ##
        # Virtual Host Configs
        ##

        include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*;

       server{
             location / {
              proxy_pass_header text-plain; 
                        }
             }
}

Solution

  • Nginx configuration are ok. But still you can't solve this problem because nginx defines MIME type according to your response from controller so, please serialize your json data before sending response. example.

    res.setHeader('Content-Type', 'text/plain'); res.send(response);
    res.send(JSON.stringify(result));
    

    now yr response header will come as 'text/plain'. and it works for me.