错误:在发送nodejs后无法设置标头

时间:2015-10-02 17:09:32

标签: node.js

当我发布新事件时,它被创建并且排序功能也正常工作但是当我调用搜索功能时,我希望它将它与名称和位置进行比较,但它不能与位置进行比较。有没有办法检查两者?排序或搜索后,当我想创建一个新事件时,它给我以下错误。我是新来的。帮助我解决这两个错误。 的 server.js

var express= require('express');
var bodyParser= require('body-parser');
var morgan = require('morgan');
var config=require('./config');
var app= express();
var mongoose=require('mongoose');
var lodash= require('lodash');
var underscore= require('underscore');
//var User=require('./database/user')
mongoose.connect('mongodb://localhost:27017/db',function(err){
    if(err){
        console.log(err);
    }
    else{
        console.log("connected!");
    }
});
//res.json({message:"     " })
app.use(bodyParser.urlencoded({extended: true })); //if false then parse only strings
app.use(bodyParser.json());
app.use(morgan('dev'));//log all the requests to the console
var api=require('./app/routes/api')(app,express,underscore,lodash);
app.use('/api',api);
app.get('*',function(req,res){
  //  res.sendFile(__dirname + '/public/views/index.html');
});   // * means any route

app.listen(config.port,function(err){
    if(err){
        console.log(err);
    }
    else{
        console.log("The server is running");
    }
});

api.js

var User= require('../models/user');
var Event=require('../models/event');
var config=require('../../config');

var secret=config.secretKey;

module.exports=function(app,express,underscore,lodash) {
    var api = express.Router();
    // app.use()

    api.post('/signup', function (req, res) {
        var user = new User({
            name: req.body.name,
            username: req.body.username,
            password: req.body.password
        });
        user.save(function (err) {
            if (err) {
                res.send(err);
                return;
            }
            res.json({
                message: 'User created!'
            });
        });

    });
    api.get('/users', function (req, res) {
        User.find({}, function (err, users) {
            if (err) {
                res.send(err);
                return;
            }
           res.json(users);
        });
    });
/*    api.get('search',function(req,res){
        search: req.body.search;
        if(search==)
    });*/


    api.post('/eventfeed', function (req, res) {
        var event = new Event({
            name: req.body.name,
            location: req.body.location,
            description: req.body.description,
            price: req.body.price,
            rating: req.body.rating
        });

        event.save(function (err) {
            if (err) {
                res.send(err);
                return;
            }
            res.json({
                message: 'Event created!'
            });
        });
    });
    api.get('/event', function (req, res) {
        Event.find({}, function (err, event) {
            if (err) {
                res.send(err);
                return;
            }
            res.json(event);
        });
    });
api.get('/sortby_price', function (req, res) {
    Event.find({}, function (err, events) {
        if (err) {
            res.send(err);
            return;
        }

        var ascending = true;//change to false for descending
        events.sort(function (a, b) {
            return (a.price - b.price) * (ascending ? 1 : -1);
                });

            res.json(events);
         });
    });
    api.get('/sortby_rating', function (req, res){
        Event.find({}, function (err, events) {
            if (err) {
                res.send(err);
                return;
            }

            var ascending = true;//change to false for descending
            events.sort(function (a, b) {
                return (a.rating - b.rating) * (ascending ? 1 : -1);
            });

            res.json(events);
        });
    });

    api.post('/search', function (req, res) {

        Event.find({'name':req.body.name},function (err, events) {

            if (err)
                return res.json(err);
            else
                res.json(events);
        });
           Event.find({'location':req.body.name},function (err, events) {

                if (err)
                    return res.json(err);
                else
                    res.json(events);

                console.log("name is" + req.body.name);
            });

        });

 return api;

}

错误

http_outgoing.js:335
    throw new Error('Can\'t set headers after they are sent.');
          ^
Error: Can't set headers after they are sent.
    at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:335:11)
    at ServerResponse.header (c:\Users\MY LAPY\WebstormProjects\Main\node_modules\express\lib\response.js:718:10)
    at ServerResponse.send (c:\Users\MY LAPY\WebstormProjects\Main\node_modules\express\lib\response.js:163:12)
    at ServerResponse.json (c:\Users\MY LAPY\WebstormProjects\Main\node_modules\express\lib\response.js:249:15)
    at Query.<anonymous> (c:\Users\MY LAPY\WebstormProjects\Main\app\routes\api.js:209:25)
    at c:\Users\MY LAPY\WebstormProjects\Main\node_modules\mongoose\node_modules\kareem\index.js:177:19
    at c:\Users\MY LAPY\WebstormProjects\Main\node_modules\mongoose\node_modules\kareem\index.js:109:16
    at process._tickCallback (node.js:355:11)

1 个答案:

答案 0 :(得分:0)

/api/search路由中,您正在并行执行两个Event.find()并且在回调内部执行每个Event.find(),您正在回复相同的http请求。

所以你需要:

  1. 只有在两个 Event.find()完成时才会调用第三个回调,因此只在那里回复请求,或者
  2. 通过在另一个回调中放置一个来顺序执行Event.find(),并且只响应最内部回调中的请求,或者
  3. 使用$or检查任一字段,仅执行一个 api.post('/search', function (req, res) { Event.find({ $or: [ {'name': req.body.name}, {'location': req.body.name} ] }, function (err, events) { if (err) return res.json(err); else res.json(events); }); }); 。例如:

    spyOn($location, 'path').and.callThrough();
    spyOn($location, 'search');