Javascript GET/500 4.732毫秒--错误:Can';t在发送邮件后设置邮件头

Javascript GET/500 4.732毫秒--错误:Can';t在发送邮件后设置邮件头,javascript,node.js,express,Javascript,Node.js,Express,我是Node.js的新手,到目前为止我已经成功安装了Express。现在我有三个js文件,它们处理对本地服务器的CRUD请求 即 然而,当我在postman中执行一个简单的get请求时,我得到了这个错误 GET /dishes 500 8.883 ms - - Error: Can't set headers after they are sent. at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:356:11) 我

我是Node.js的新手,到目前为止我已经成功安装了Express。现在我有三个js文件,它们处理对本地服务器的CRUD请求

然而,当我在postman中执行一个简单的get请求时,我得到了这个错误

GET /dishes 500 8.883 ms - -
Error: Can't set headers after they are sent.
at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:356:11)
我要给你看我的文件

dishRouter.js

//exporing the functionality
module.exports = function (dishRouter, bp) {
dishRouter.use(bp.json()); //using body parser for parsing json from body 
content
//code for url '/'
dishRouter.route('/').all(function (req, res, next) {
        res.writeHead(200, {
            'Content-Type': 'text/plain'
        });
        next();
    })
    //setting up code for get request
    .get(function (req, res, next) {
        res.end('Will send all the dishes to you!');
    })
    //setting up code for post request
    .post(function (req, res, next) {
        res.end('Will add the dish: ' + req.body.name + ' with details: ' + 
    req.body.description);
    })
    //setting up code for delete request
    .delete(function (req, res, next) {
        res.end('Deleting all dishes');
    });
//code for url with specific ids
dishRouter.route('/:dishId')
    .all(function (req, res, next) {
        res.writeHead(200, {
            'Content-Type': 'text/plain'
        });
        next();
    })
    //setting up code for get request
    .get(function (req, res, next) {
        res.end('Will send details of the dish: ' + req.params.dishId + ' to you!');
    })
    //setting up code for put request
    .put(function (req, res, next) {
        res.write('Updating the dish: ' + req.params.dishId + '\n');
        res.end('Will update the dish: ' + req.body.name +
            ' with details: ' + req.body.description);
    })
    //setting up code for delete request
    .delete(function (req, res, next) {
        res.end('Deleting dish: ' + req.params.dishId);
    });

 };
   //exporting the functionality
    module.exports = function (promoRouter, bp) {
        promoRouter.use(bp.json()); //using body parser for parsing json 
    from body content
        //code for url '/'
        promoRouter.route('/').all(function (req, res, next) {
                res.writeHead(200, { //writing header
                    'Content-Type': 'text/plain'
                });
                next();
            })
            //setting up code for get request
            .get(function (req, res, next) {
                res.end('Will send all the promotions to you!');
            })
            //setting up code for post request
            .post(function (req, res, next) {
                res.end('Will add the promotion: ' + req.body.name + ' with 
    details: ' + req.body.description);
            })
            //setting up code for delete request
            .delete(function (req, res, next) {
                res.end('Deleting all promotions');
            });
        //code for url with specific ids
        promoRouter.route('/:promoId')
            .all(function (req, res, next) {
                res.writeHead(200, {
                    'Content-Type': 'text/plain'
                });
                next();
            })
            //setting up code for get request
            .get(function (req, res, next) {
                res.end('Will send details of the promotion: ' + 
    req.params.promoId + ' to you!');
            })
            //setting up code for put request
            .put(function (req, res, next) {
                res.write('Updating the promotion: ' + req.params.promoId + '\n');
                res.end('Will update the promotion: ' + req.body.name +
                    ' with details: ' + req.body.description);
            })
            //setting up code for delete request
            .delete(function (req, res, next) {
                res.end('Deleting promotion: ' + req.params.promoId);
            });
    };
//exporing the functionality
module.exports = function (leaderRouter, bp) {
leaderRouter.use(bp.json()); //using body parser for parsing json from body 
 content
//code for url '/'
leaderRouter.route('/').all(function (req, res, next) {
        res.writeHead(200, {
            'Content-Type': 'text/plain'
        });
        next();
    })
    //setting up code for get request
    .get(function (req, res, next) {
        res.end('Will send all the leaders to you!');
    })
    //setting up code for post request
    .post(function (req, res, next) {
        res.end('Will add the leader: ' + req.body.name + ' with details: ' 
   + req.body.description);
    })
    //setting up code for delete request
    .delete(function (req, res, next) {
        res.end('Deleting all leaders');
    });
//code for url with specific ids
leaderRouter.route('/:leaderId')
    .all(function (req, res, next) {
        res.writeHead(200, {
            'Content-Type': 'text/plain'
        });
        next();
    })
    //setting up code for get request
    .get(function (req, res, next) {
        res.end('Will send details of the leader: ' + req.params.leaderId + ' to you!');
    })
    //setting up code for put request
    .put(function (req, res, next) {
        res.write('Updating the leader: ' + req.params.leaderId + '\n');
        res.end('Will update the leader: ' + req.body.name +
            ' with details: ' + req.body.description);
    })
    //setting up code for delete request
    .delete(function (req, res, next) {
        res.end('Deleting leader: ' + req.params.leaderId);
    });
 };
    var express = require('express');
    var morgan  = require('morgan');
    var port = 3000;
    var hostname = 'localhost';

    var app = express();

    app.use(morgan('dev'));

    var dishRouter = require('./dishRouter');
    app.use('/dishes',dishRouter.exports);

    var leaderRouter = require('./leaderRouter');
    app.use('/leadership', leaderRouter.router);

    var promoRouter = require('./promoRouter');
    app.use('/promotions', promoRouter.router);


    app.use(express.static(__dirname + '/public'));

    app.listen(port, hostname, function () {
        console.log(`Server running at http://${hostname}:${port}/`);
    });
promoRouter.js

//exporing the functionality
module.exports = function (dishRouter, bp) {
dishRouter.use(bp.json()); //using body parser for parsing json from body 
content
//code for url '/'
dishRouter.route('/').all(function (req, res, next) {
        res.writeHead(200, {
            'Content-Type': 'text/plain'
        });
        next();
    })
    //setting up code for get request
    .get(function (req, res, next) {
        res.end('Will send all the dishes to you!');
    })
    //setting up code for post request
    .post(function (req, res, next) {
        res.end('Will add the dish: ' + req.body.name + ' with details: ' + 
    req.body.description);
    })
    //setting up code for delete request
    .delete(function (req, res, next) {
        res.end('Deleting all dishes');
    });
//code for url with specific ids
dishRouter.route('/:dishId')
    .all(function (req, res, next) {
        res.writeHead(200, {
            'Content-Type': 'text/plain'
        });
        next();
    })
    //setting up code for get request
    .get(function (req, res, next) {
        res.end('Will send details of the dish: ' + req.params.dishId + ' to you!');
    })
    //setting up code for put request
    .put(function (req, res, next) {
        res.write('Updating the dish: ' + req.params.dishId + '\n');
        res.end('Will update the dish: ' + req.body.name +
            ' with details: ' + req.body.description);
    })
    //setting up code for delete request
    .delete(function (req, res, next) {
        res.end('Deleting dish: ' + req.params.dishId);
    });

 };
   //exporting the functionality
    module.exports = function (promoRouter, bp) {
        promoRouter.use(bp.json()); //using body parser for parsing json 
    from body content
        //code for url '/'
        promoRouter.route('/').all(function (req, res, next) {
                res.writeHead(200, { //writing header
                    'Content-Type': 'text/plain'
                });
                next();
            })
            //setting up code for get request
            .get(function (req, res, next) {
                res.end('Will send all the promotions to you!');
            })
            //setting up code for post request
            .post(function (req, res, next) {
                res.end('Will add the promotion: ' + req.body.name + ' with 
    details: ' + req.body.description);
            })
            //setting up code for delete request
            .delete(function (req, res, next) {
                res.end('Deleting all promotions');
            });
        //code for url with specific ids
        promoRouter.route('/:promoId')
            .all(function (req, res, next) {
                res.writeHead(200, {
                    'Content-Type': 'text/plain'
                });
                next();
            })
            //setting up code for get request
            .get(function (req, res, next) {
                res.end('Will send details of the promotion: ' + 
    req.params.promoId + ' to you!');
            })
            //setting up code for put request
            .put(function (req, res, next) {
                res.write('Updating the promotion: ' + req.params.promoId + '\n');
                res.end('Will update the promotion: ' + req.body.name +
                    ' with details: ' + req.body.description);
            })
            //setting up code for delete request
            .delete(function (req, res, next) {
                res.end('Deleting promotion: ' + req.params.promoId);
            });
    };
//exporing the functionality
module.exports = function (leaderRouter, bp) {
leaderRouter.use(bp.json()); //using body parser for parsing json from body 
 content
//code for url '/'
leaderRouter.route('/').all(function (req, res, next) {
        res.writeHead(200, {
            'Content-Type': 'text/plain'
        });
        next();
    })
    //setting up code for get request
    .get(function (req, res, next) {
        res.end('Will send all the leaders to you!');
    })
    //setting up code for post request
    .post(function (req, res, next) {
        res.end('Will add the leader: ' + req.body.name + ' with details: ' 
   + req.body.description);
    })
    //setting up code for delete request
    .delete(function (req, res, next) {
        res.end('Deleting all leaders');
    });
//code for url with specific ids
leaderRouter.route('/:leaderId')
    .all(function (req, res, next) {
        res.writeHead(200, {
            'Content-Type': 'text/plain'
        });
        next();
    })
    //setting up code for get request
    .get(function (req, res, next) {
        res.end('Will send details of the leader: ' + req.params.leaderId + ' to you!');
    })
    //setting up code for put request
    .put(function (req, res, next) {
        res.write('Updating the leader: ' + req.params.leaderId + '\n');
        res.end('Will update the leader: ' + req.body.name +
            ' with details: ' + req.body.description);
    })
    //setting up code for delete request
    .delete(function (req, res, next) {
        res.end('Deleting leader: ' + req.params.leaderId);
    });
 };
    var express = require('express');
    var morgan  = require('morgan');
    var port = 3000;
    var hostname = 'localhost';

    var app = express();

    app.use(morgan('dev'));

    var dishRouter = require('./dishRouter');
    app.use('/dishes',dishRouter.exports);

    var leaderRouter = require('./leaderRouter');
    app.use('/leadership', leaderRouter.router);

    var promoRouter = require('./promoRouter');
    app.use('/promotions', promoRouter.router);


    app.use(express.static(__dirname + '/public'));

    app.listen(port, hostname, function () {
        console.log(`Server running at http://${hostname}:${port}/`);
    });
leaderRouter.js

//exporing the functionality
module.exports = function (dishRouter, bp) {
dishRouter.use(bp.json()); //using body parser for parsing json from body 
content
//code for url '/'
dishRouter.route('/').all(function (req, res, next) {
        res.writeHead(200, {
            'Content-Type': 'text/plain'
        });
        next();
    })
    //setting up code for get request
    .get(function (req, res, next) {
        res.end('Will send all the dishes to you!');
    })
    //setting up code for post request
    .post(function (req, res, next) {
        res.end('Will add the dish: ' + req.body.name + ' with details: ' + 
    req.body.description);
    })
    //setting up code for delete request
    .delete(function (req, res, next) {
        res.end('Deleting all dishes');
    });
//code for url with specific ids
dishRouter.route('/:dishId')
    .all(function (req, res, next) {
        res.writeHead(200, {
            'Content-Type': 'text/plain'
        });
        next();
    })
    //setting up code for get request
    .get(function (req, res, next) {
        res.end('Will send details of the dish: ' + req.params.dishId + ' to you!');
    })
    //setting up code for put request
    .put(function (req, res, next) {
        res.write('Updating the dish: ' + req.params.dishId + '\n');
        res.end('Will update the dish: ' + req.body.name +
            ' with details: ' + req.body.description);
    })
    //setting up code for delete request
    .delete(function (req, res, next) {
        res.end('Deleting dish: ' + req.params.dishId);
    });

 };
   //exporting the functionality
    module.exports = function (promoRouter, bp) {
        promoRouter.use(bp.json()); //using body parser for parsing json 
    from body content
        //code for url '/'
        promoRouter.route('/').all(function (req, res, next) {
                res.writeHead(200, { //writing header
                    'Content-Type': 'text/plain'
                });
                next();
            })
            //setting up code for get request
            .get(function (req, res, next) {
                res.end('Will send all the promotions to you!');
            })
            //setting up code for post request
            .post(function (req, res, next) {
                res.end('Will add the promotion: ' + req.body.name + ' with 
    details: ' + req.body.description);
            })
            //setting up code for delete request
            .delete(function (req, res, next) {
                res.end('Deleting all promotions');
            });
        //code for url with specific ids
        promoRouter.route('/:promoId')
            .all(function (req, res, next) {
                res.writeHead(200, {
                    'Content-Type': 'text/plain'
                });
                next();
            })
            //setting up code for get request
            .get(function (req, res, next) {
                res.end('Will send details of the promotion: ' + 
    req.params.promoId + ' to you!');
            })
            //setting up code for put request
            .put(function (req, res, next) {
                res.write('Updating the promotion: ' + req.params.promoId + '\n');
                res.end('Will update the promotion: ' + req.body.name +
                    ' with details: ' + req.body.description);
            })
            //setting up code for delete request
            .delete(function (req, res, next) {
                res.end('Deleting promotion: ' + req.params.promoId);
            });
    };
//exporing the functionality
module.exports = function (leaderRouter, bp) {
leaderRouter.use(bp.json()); //using body parser for parsing json from body 
 content
//code for url '/'
leaderRouter.route('/').all(function (req, res, next) {
        res.writeHead(200, {
            'Content-Type': 'text/plain'
        });
        next();
    })
    //setting up code for get request
    .get(function (req, res, next) {
        res.end('Will send all the leaders to you!');
    })
    //setting up code for post request
    .post(function (req, res, next) {
        res.end('Will add the leader: ' + req.body.name + ' with details: ' 
   + req.body.description);
    })
    //setting up code for delete request
    .delete(function (req, res, next) {
        res.end('Deleting all leaders');
    });
//code for url with specific ids
leaderRouter.route('/:leaderId')
    .all(function (req, res, next) {
        res.writeHead(200, {
            'Content-Type': 'text/plain'
        });
        next();
    })
    //setting up code for get request
    .get(function (req, res, next) {
        res.end('Will send details of the leader: ' + req.params.leaderId + ' to you!');
    })
    //setting up code for put request
    .put(function (req, res, next) {
        res.write('Updating the leader: ' + req.params.leaderId + '\n');
        res.end('Will update the leader: ' + req.body.name +
            ' with details: ' + req.body.description);
    })
    //setting up code for delete request
    .delete(function (req, res, next) {
        res.end('Deleting leader: ' + req.params.leaderId);
    });
 };
    var express = require('express');
    var morgan  = require('morgan');
    var port = 3000;
    var hostname = 'localhost';

    var app = express();

    app.use(morgan('dev'));

    var dishRouter = require('./dishRouter');
    app.use('/dishes',dishRouter.exports);

    var leaderRouter = require('./leaderRouter');
    app.use('/leadership', leaderRouter.router);

    var promoRouter = require('./promoRouter');
    app.use('/promotions', promoRouter.router);


    app.use(express.static(__dirname + '/public'));

    app.listen(port, hostname, function () {
        console.log(`Server running at http://${hostname}:${port}/`);
    });
server.js

//exporing the functionality
module.exports = function (dishRouter, bp) {
dishRouter.use(bp.json()); //using body parser for parsing json from body 
content
//code for url '/'
dishRouter.route('/').all(function (req, res, next) {
        res.writeHead(200, {
            'Content-Type': 'text/plain'
        });
        next();
    })
    //setting up code for get request
    .get(function (req, res, next) {
        res.end('Will send all the dishes to you!');
    })
    //setting up code for post request
    .post(function (req, res, next) {
        res.end('Will add the dish: ' + req.body.name + ' with details: ' + 
    req.body.description);
    })
    //setting up code for delete request
    .delete(function (req, res, next) {
        res.end('Deleting all dishes');
    });
//code for url with specific ids
dishRouter.route('/:dishId')
    .all(function (req, res, next) {
        res.writeHead(200, {
            'Content-Type': 'text/plain'
        });
        next();
    })
    //setting up code for get request
    .get(function (req, res, next) {
        res.end('Will send details of the dish: ' + req.params.dishId + ' to you!');
    })
    //setting up code for put request
    .put(function (req, res, next) {
        res.write('Updating the dish: ' + req.params.dishId + '\n');
        res.end('Will update the dish: ' + req.body.name +
            ' with details: ' + req.body.description);
    })
    //setting up code for delete request
    .delete(function (req, res, next) {
        res.end('Deleting dish: ' + req.params.dishId);
    });

 };
   //exporting the functionality
    module.exports = function (promoRouter, bp) {
        promoRouter.use(bp.json()); //using body parser for parsing json 
    from body content
        //code for url '/'
        promoRouter.route('/').all(function (req, res, next) {
                res.writeHead(200, { //writing header
                    'Content-Type': 'text/plain'
                });
                next();
            })
            //setting up code for get request
            .get(function (req, res, next) {
                res.end('Will send all the promotions to you!');
            })
            //setting up code for post request
            .post(function (req, res, next) {
                res.end('Will add the promotion: ' + req.body.name + ' with 
    details: ' + req.body.description);
            })
            //setting up code for delete request
            .delete(function (req, res, next) {
                res.end('Deleting all promotions');
            });
        //code for url with specific ids
        promoRouter.route('/:promoId')
            .all(function (req, res, next) {
                res.writeHead(200, {
                    'Content-Type': 'text/plain'
                });
                next();
            })
            //setting up code for get request
            .get(function (req, res, next) {
                res.end('Will send details of the promotion: ' + 
    req.params.promoId + ' to you!');
            })
            //setting up code for put request
            .put(function (req, res, next) {
                res.write('Updating the promotion: ' + req.params.promoId + '\n');
                res.end('Will update the promotion: ' + req.body.name +
                    ' with details: ' + req.body.description);
            })
            //setting up code for delete request
            .delete(function (req, res, next) {
                res.end('Deleting promotion: ' + req.params.promoId);
            });
    };
//exporing the functionality
module.exports = function (leaderRouter, bp) {
leaderRouter.use(bp.json()); //using body parser for parsing json from body 
 content
//code for url '/'
leaderRouter.route('/').all(function (req, res, next) {
        res.writeHead(200, {
            'Content-Type': 'text/plain'
        });
        next();
    })
    //setting up code for get request
    .get(function (req, res, next) {
        res.end('Will send all the leaders to you!');
    })
    //setting up code for post request
    .post(function (req, res, next) {
        res.end('Will add the leader: ' + req.body.name + ' with details: ' 
   + req.body.description);
    })
    //setting up code for delete request
    .delete(function (req, res, next) {
        res.end('Deleting all leaders');
    });
//code for url with specific ids
leaderRouter.route('/:leaderId')
    .all(function (req, res, next) {
        res.writeHead(200, {
            'Content-Type': 'text/plain'
        });
        next();
    })
    //setting up code for get request
    .get(function (req, res, next) {
        res.end('Will send details of the leader: ' + req.params.leaderId + ' to you!');
    })
    //setting up code for put request
    .put(function (req, res, next) {
        res.write('Updating the leader: ' + req.params.leaderId + '\n');
        res.end('Will update the leader: ' + req.body.name +
            ' with details: ' + req.body.description);
    })
    //setting up code for delete request
    .delete(function (req, res, next) {
        res.end('Deleting leader: ' + req.params.leaderId);
    });
 };
    var express = require('express');
    var morgan  = require('morgan');
    var port = 3000;
    var hostname = 'localhost';

    var app = express();

    app.use(morgan('dev'));

    var dishRouter = require('./dishRouter');
    app.use('/dishes',dishRouter.exports);

    var leaderRouter = require('./leaderRouter');
    app.use('/leadership', leaderRouter.router);

    var promoRouter = require('./promoRouter');
    app.use('/promotions', promoRouter.router);


    app.use(express.static(__dirname + '/public'));

    app.listen(port, hostname, function () {
        console.log(`Server running at http://${hostname}:${port}/`);
    });
上述4个文件位于routes文件夹中。最后,我有了app.js

var express = require('express');
    var path = require('path');
    var favicon = require('serve-favicon');
    var logger = require('morgan');
    var cookieParser = require('cookie-parser');
    var bodyParser = require('body-parser');

    var routes = require('./routes/index');
    var users = require('./routes/users');
    var dishRouter = require('./routes/dishRouter');
    var promoRouter = require('./routes/promoRouter');
    var leaderRouter = require('./routes/leaderRouter');

    var app = express();

    // view engine setup
    app.set('views', path.join(__dirname, 'views'));
    app.set('view engine', 'jade');

    // uncomment after placing your favicon in /public
    //app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));

    app.use(logger('dev'));
    app.use(bodyParser.json());
    app.use(bodyParser.urlencoded({ extended: false }));
    app.use(cookieParser());

    app.use(express.static(path.join(__dirname, 'public')));

    app.use('/', routes);
    app.use('/users', users);
    app.use('/dishes',dishRouter);
    app.use('/promotions',promoRouter);
    app.use('/leadership',leaderRouter);

    // catch 404 and forward to error handler
    app.use(function(req, res, next) {
      var err = new Error('Not Found');
      err.status = 404;
      next(err);
    });

    // error handlers
    // development error handler
    // will print stacktrace
    if (app.get('env') === 'development') {
      app.use(function(err, req, res, next) {
        res.status(err.status || 500);
        res.render('error', {
          message: err.message,
          error: err
        });
      });
    }

    // production error handler
    // no stacktraces leaked to user
    app.use(function(err, req, res, next) {
      res.status(err.status || 500);
      res.render('error', {
        message: err.message,
        error: {}
      });
    });

    module.exports = app;
你知道我为什么会犯这个错误吗?请给我一些建议

谢谢


Theo.

我猜您的错误处理程序被触发,它使用
res.render()
,将触发“发送后无法设置头”错误,因为您正在路由器中使用
res.writeHead()
。暂时尝试删除
res.writeHead
行,然后重试。也许错误的位置会暴露出来。@robertklep。谢谢你的回复。我从dishRouter中删除了writeHead()函数,但是当我使用localhost:3000/dishs.Hmm时,我得到了相同的错误。这是您正在使用的实际代码吗?因为所有的路由器文件都会导出一个函数,但这些函数似乎从未被调用。我在一个名为server.js的文件中调用它们。我更新了我的问题。你有两个文件,
server.js
app.js
基本上都在做同样的事情?还有,为什么
dishRouter.exports
但是
leaderRouter.router
promoRouter.router
.exports
vs
.router
)?