【问题标题】:TypeError: You may only yield a function, promise, generator... when yielding app.listen()TypeError: 你只能在产生 app.listen() 时产生一个函数、promise、generator...
【发布时间】:2017-06-29 09:59:58
【问题描述】:

我不知道这个生成器函数有什么问题:

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);”这一行创建错误:“类型错误:您只能生成一个函数、promise、生成器、数组或对象,但传递了以下对象:“[object Object]”。

【问题讨论】:

    标签: javascript node.js express generator


    【解决方案1】:

    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);
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-01
      • 2019-12-15
      相关资源
      最近更新 更多