javascript - 在 Node JS Express 中使用 Promise

标签 javascript node.js express promise es6-promise

我是 promise 的新手,我正在尝试了解它们是如何工作的。

首先是我的问题:

  1. 当在路由函数中处理请求时,它是否会等待所有的 Promise,我的意思是,当我使用 Promise 或回调时,它是一个新的作用域,并且会进一步继续执行。

  2. 如果我在计时器中保留一个 req/res 对象,然后响应用户,用户会看到什么?在我明确发送响应之前,请求将被阻止?

所以我遇到了以下问题。

这是我的路线。

router.post('book', authHandler.provideMiddleware(), (req, res) => {
      bookManager.createBook(req.body, {
            onSuccess: function (data) {
               respondSuccess(res,HttpStatus.OK, {'data': data});
            },
            onError: function (message) {
                respondError(res, HttpStatus.HTTP_STATUS.BAD_REQUEST, {'error': message});
            }
        });
});

在图书管理器中我有以下内容

  createBook(data, hook) {
        let book = createBookFromRequest(data);
        let verifyData = new Promise((resolve, reject) => {
            let valid = checkBookData(book);
            if(valid) {
               resolve(book);
            }
            else {
                reject("Invalid data");
            }
        });
        let createBook = new Promise((resolve, reject) => {
            book.save((err, result) => {
                if (!err) {
                    reject("Error while saving");
                }
                else {
                    resolve(result);
                }
            });

        });
        verifyData
            .then(() => {
                return createBook;
            })
            .then((data) => {
                hook.onSuccess(data);
            })
            .catch((error) => {
                hook.onError(error);
            });
    }

我的想法是链接多个函数,如果发生任何错误,则调用 hook.onError 方法,否则调用成功。

我这里有几个问题。

  1. 当抛出错误时,我的书仍然会创建。
  2. 我遇到以下错误

    Node :8753)UnhandledPromiseRejectionWarning:未处理的 promise 拒绝(拒绝ID:6):错误:发送后无法设置 header 。

我想使用像 Rx(响应式(Reactive)扩展)这样的方法。

有人可以解释一下哪里出了问题以及在这种情况下 promise 如何真正发挥作用吗?

最佳答案

1. When request is handled in a route function, does it wait for all promises, I mean that when I am using promise or callback it is a new scope and execution continues further.

它等待您通过 res 发送响应。您不必为了响应事件而这样做,在异步过程(如 promise 解析)完成之后,这绝对是正常的。

2. If I keep a req/res objects for example in timer and then respond to user, what will user see ? A request will just be blocked until I explicitly send response ?

是的。

I have several problems here.

1. When error is thrown, my book is still created.

无论数据是否经过验证,您都始终开始创建图书的过程。 new Promise 开始工作。

2. I have the following error

node:8753) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 6): Error: Can't set headers after they are sent.

您正在创建一个 Promise 并将其存储在 createBook 中,并且如果 verifyData 拒绝,则永远不会处理该 Promise 的拒绝。所以你会得到一个未处理的 promise 拒绝。

您可以摆脱保存书籍时的整个new Promise,并将其放入verifyData链中;见评论:

createBook(data, hook) {
    let book = createBookFromRequest(data);
    let verifyData = new Promise((resolve, reject) => {
        let valid = checkBookData(book);
        if (valid) {
            resolve(book);
        }
        else {
            reject("Invalid data");
        }
    });
    verifyData
        .then(() => book.save())  // The chain takes on the state of the promise
                                  // returned by `book.save`
        .then(data => {
            hook.onSuccess(data);
        })
        .catch((error) => {
            hook.onError(error);
        });
}

在此,我假设 createBookFromRequestcheckBookData 都是同步进程,因为这就是您使用它们的方式。

实际上,鉴于这种情况,我认为您没有必要创建 promise 来验证数据。所以它可以更简单:

createBook(data, hook) {
    let book = createBookFromRequest(data);
    if (checkBookData(book)) {
        book.save()
            .then(_ => hook.onSuccess(data))
            .catch(error => hook.onError(error));
    } else {
        hook.onError("Invalid data");
    }
}

关于javascript - 在 Node JS Express 中使用 Promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43886305/

相关文章:

c# - 警报不起作用,这有什么问题

javascript - Node.js:异步函数似乎不等待 for 循环中 Promise 的解析

javascript - 有没有办法像 Mongoose 一样在 Sequelize 时间戳中设置 'expires' 选项?

node.js - NodeJS Swig 数学

javascript - JQuery 文本编辑器 - 在工具栏中添加附加下拉列表

javascript - 拉取alt的值

javascript - 如何在提交回调时使用精细 uploader 获取文件大小

node.js - NodeJS 需要模块无法工作

javascript - 使用 axios 进行多个请求,而不等待所有请求在数组列表中完成?

node.js - 错误 : ENOENT: no such file or directory,