(node:2684)UnhandledPromiseRejectionWarning:未处理的promise拒绝(拒绝id:1):TypeError:无法读取未定义的属性'then'

时间:2017-02-22 15:00:23

标签: node.js express promise

我第一次使用.then而不是。然后我使用回调函数。

以下是我的代码段:

phantom.create().then(function (ph) {
    ph.createPage().then(function (page) {
        page.open("http://codebeautify.org/xmlvalidator").then(function (status) {
            page.render(base_pdf_path + lpnumber + '.pdf').then(function () {
                console.log('PDF generated for waybill');
                //Insert waybill url in db.
                return waybill_url.insertWaybillUrl('Lpsimer', waybillUrl).then(function (waybill_inserted_resp) {
                    callback(null, true);   
                }).catch(function (error) {
                    callback(err_waybill_inserted);
                });
            });
        });
    });
});

上面的函数调用的函数如下所示,这是在另一个文件中并正确调用filename是waybill.js:

var mongoose = require('mongoose');
var q = require('promised-io/promise');

var WaybillUrlSchema = new mongoose.Schema({
    lpnumber: String,
    url: String,
    waybilltime: Date
});

module.exports = {

    insertWaybillUrl: function (lpnumber, url) {
        var defer = q.defer();
        var waybill_insert = new waybill_url({
            lpnumber: lpnumber,
            url: url,
            waybilltime: new Date()
        });

        //Save model to MongoDB
        waybill_insert.save(function (err, inserted_waybill) {
            if (err) {
                return defer.reject(err);
            }
            else {
                return defer.resolve(inserted_waybill);
            }
        });
    }
};

之前我使用这种模式进行回调,它运行良好:

waybill_url.insertWaybillUrl('Lpsimer', waybillUrl, function(err, success) {
   if (err) {

   } else {

   }
)}

现在由于使用幻像代码来编写PDF,我必须使用.then,这使得工作变得繁琐。

需要建议我如何在回调中进行回调。

更新

phantom.create().then(function (ph) {

    ph.createPage().then(function (page) {

        page.open("http://codebeautify.org/xmlvalidator").then(function (status) {
            page.render(base_pdf_path + lpnumber + '.pdf').then(function () {

                //Insert waybill url in db.

                waybill_url.insertWaybillUrl('Lpsimer', waybillUrl).then(function (waybill_inserted_resp) {

                    if (waybill_inserted_resp) {

                        callback(null, true);

                    }

                }).catch(function (error_waybill_url_insert) {

                    console.log("Error in inserting waybill:" + err_waybill_inserted);

                    callback(error_waybill_url_insert);
                });

            }).catch(function (error_render) {

                console.log("error_render");
                callback(error_render);
            });

        }).catch(function (error_open) {

            callback(error_open);

        });

    }).catch(function (error_create_page) {

        callback(error_create_page);

    });

}).catch(function (error_phantom_create) {

    callback(error_phantom_create);
});

现在我已经按照rsp在他的回答中的建议添加了catch,但是现在我收到错误,我已经捕获并发送到另一个回调:

  

无法读取未定义的属性'然后'

我收到了这个错误,我添加了console.log(“error_render”); 这就是我调用幻影的page.render函数的地方。

我的要求很简单。我想使用幻像生成一个PDF文件然后我只想调用另一个文件中的另一个函数waybill_url,函数名:waybill_url.insertWaybillUrl 。但由于回调和异步行为,这两个函数的简单调用变得很麻烦。

1 个答案:

答案 0 :(得分:3)

确保您使用CC=gcc CFLAGS=-C all: P0 export PATH=${PATH}:. P0 : main.o $(CC) -0 P0 main.o main.o: main.c $(CC) $(CFLAGS) main.c 而不仅仅是catch() - 或then()的两个参数。否则你将无法处理错误,你将收到该警告 - 在下一版本的Node中,这将是一个错误,而不是一个警告。

有关它的更多信息,请参阅此答案: