2017-02-08 7 views
0

Я закодировал минималистский сервер для управления службами REST. Предполагается, что только кодированный маршрут будет извлекать данные из mongo, а затем отправить его клиенту. Код ниже.Не удается удалить заголовки после их отправки в Koa

var kr = require('koa-route'); 
var koa = require('koa'); 
var app = koa(); 

var MongoClient = require("mongodb").MongoClient; 

var events = function *() 
{ 
    var _this = this; 

    MongoClient.connect("mongodb://localhost/eventdata", function(error, db) { 
     if (error) throw(error); 
     console.log("Connecté à la base de données"); 

     db.collection('events').find().toArray(function(err, array) 
     { 
      console.log('returning %d objects', array.length); 
      db.close(); 
      _this.body = {eventsArray : array}; 

     }); 
    }); 
} 

app.use(kr.get('/events', events)); 

app.listen(3000); 

Коа является версия 1.2.4

Когда я пытаюсь достигнуть его, я получаю сообщение об ошибке «Не удается удалить заголовки после их отправки». Мне удалось понять, что программа (вроде) завершает отправку назад ответа до завершения поиска(). Поэтому, когда вызывается _this.body = {...}, это вызывает ошибку.

Теперь вопрос: как это исправить? Я только начал практиковать Коа, поэтому есть много вещей, к которым я не привык.

Я протестировал решение, предлагаемое здесь: Can't remove headers after they are sent, но оно не работает. Появляется следующее сообщение об ошибке:

eventsArray = yield db.collection('events').find({}) 
        ^^ 
SyntaxError : unexpected identifier 

Заранее за вашу помощь.

ответ

2

похоже, что вам нужно обернуть db req, чтобы обещать. Попробуйте таким образом

var kr = require('koa-route'); 
 
var koa = require('koa'); 
 
var app = koa(); 
 

 
var MongoClient = require("mongodb").MongoClient; 
 
var eventsPromise = function(){ 
 
    return new Promise(function(resolve, reject){ 
 
     MongoClient.connect("mongodb://localhost/eventdata", function(error, db) { 
 
     if (error){ 
 
      return reject(error); 
 
     } 
 
     console.log("Connecté à la base de données"); 
 

 
     db.collection('events').find().toArray(function(err, array) 
 
     { 
 
      console.log('returning %d objects', array.length); 
 
      db.close(); 
 
      return reslove({eventsArray : array}); 
 
     }); 
 
    }); 
 
    }); 
 
} 
 
var events = function *() 
 
{ 
 
    var event = yiled eventsPromise(); 
 
    this.body = event; 
 
} 
 

 
app.use(kr.get('/events', events)); 
 

 
app.listen(3000);

+0

Впечатляет! Не могли бы вы немного объяснить? Думаю, я не совсем понял концепцию «доходности» ... – MrFlo

+0

Рад помочь. Koa - использует функцию генератора в качестве промежуточного элемента. (читайте некоторые о генераторах здесь https://davidwalsh.name/es6-generators) Итак, yiled - как пауза функции генератора. Мы ждем результата обещания, а затем переходим к следующему –

+0

Почти все просто. Большое спасибо !! – MrFlo

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