2015-10-02 25 views
0

Когда я отправляю новое событие, оно создается, и функция сортировки работает нормально, но когда я вызываю функцию поиска, я хочу, чтобы она сравнивала ее с именем и местоположение, но оно не сравнивается с местоположением. Есть ли способ проверить оба? Также после сортировки или поиска, когда я хочу создать новое событие, он дает мне следующую ошибку. Я новичок в этом. Помогите мне с обоими ошибками. server.jsОшибка: не удается установить заголовки после их отправки nodejs

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) 

ответ

0

В вашем /api/search маршруте, вы выполняете два Event.find() сек параллельно и внутри c allback для каждого из них, вы отвечаете на один и тот же HTTP-запрос.

Так что вам нужно либо:

  1. Есть третий обратный вызов, который вызывается только тогда, когда обаEvent.find() s завершена, так что вы ответить на запрос только один раз там, ИЛИ
  2. Выполните Event.find() последовательно, помещая один внутри обратного вызова другого и только отвечать на запрос внутри самого внутреннего обратного вызова, ИЛИ
  3. Выполнять только Event.find(), используя $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); 
        }); 
    }); 
    
+0

Спасибо. Работал для меня :) – RayOfHope

Смежные вопросы