2017-02-10 49 views
0

我分不清什麼是錯這個發生器功能:類型錯誤:你可能只產生一個功能,承諾,發電機......產生app.listen時()

var dbUrl = 'mongodb://localhost:27017/voyanta'; 
var db; 
var server; 

co(function*() { 
    // Use connect method to connect to the Server 
    db = yield MongoClient.connect(dbUrl); 
    server = yield app.listen(3000); 
    console.log('Connected to database. Listening on port 3000.'); 

}).catch(function(err) { 
    console.log(err.stack); 
}); 

它看起來完全沒有給我,但行「server = yield app.listen(3000);」創建錯誤:「類型錯誤:您可能只產生函數,承諾,生成器,數組或對象,但傳遞了以下對象:」[object Object]「

回答

2

app.listen(3000)不返回承諾。

相反的:

server = yield app.listen(3000); 

,你可以這樣做:

server = app.listen(3000); 
yield new Promise(res => server.on('listening', res)); 

或更好:

server = app.listen(3000); 
yield new Promise((res, rej) => { 
    server.on('listening', res); 
    server.on('error', rej); 
}); 

測試該示例:

var co = require('co'); 
var app = require('express')(); 

co(function*() { 
    server = app.listen(3000); 
    yield new Promise((res, rej) => { 
     server.on('listening', res); 
     server.on('error', rej); 
    }); 
    console.log('Listening on port 3000.'); 
}).catch(function(err) { 
    console.log(err.stack); 
});